回答編集履歴

1

サンプルコードを追記

2019/01/26 14:33

投稿

firedfly
firedfly

スコア1131

test CHANGED
@@ -15,3 +15,87 @@
15
15
     そのうちの最古日付の値を保存(なければNan)
16
16
 
17
17
  ```
18
+
19
+
20
+
21
+ 【追記】
22
+
23
+ 解決したようでなによりです。
24
+
25
+ サンプルを実装してみたので、こういう方法もありだなと思って頂ければ幸いです。
26
+
27
+ 以下、サンプルCSV、コード、結果出力。
28
+
29
+
30
+
31
+ ```csv
32
+
33
+ id date val
34
+
35
+ 1 2017-01-01 NaN
36
+
37
+ 1 2017-01-02 1
38
+
39
+ 2 2017-01-01 2
40
+
41
+ 2 2017-01-02 3
42
+
43
+ 3 2017-01-01 0
44
+
45
+ 3 2017-01-02 NaN
46
+
47
+ ```
48
+
49
+
50
+
51
+ ```Python
52
+
53
+ import pandas as pd
54
+
55
+
56
+
57
+ df = pd.read_csv('data.csv', delimiter='\t')
58
+
59
+ id_list = df.id.unique()
60
+
61
+
62
+
63
+ # 値が0かNaNの行を削除
64
+
65
+ df = df.loc[df.val != 0]
66
+
67
+ df = df.dropna()
68
+
69
+
70
+
71
+ for id in id_list:
72
+
73
+ df_id = df.loc[df.id == id] # idごとのDataFrame
74
+
75
+
76
+
77
+ if len(df_id) == 0:
78
+
79
+ print('id:{} is val:Nan'.format(id))
80
+
81
+ else:
82
+
83
+ # 日付が最小の行を抽出
84
+
85
+ min_row = df_id.loc[df_id.date == df_id.date.min()]
86
+
87
+ print('id:{} is val:{}'.format(id, min_row.values[0][2]))
88
+
89
+ ```
90
+
91
+
92
+
93
+ ```sh
94
+
95
+ id:1 is val:1.0
96
+
97
+ id:2 is val:2.0
98
+
99
+ id:3 is val:Nan
100
+
101
+ ```