teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

サンプルコードを追記

2019/01/26 14:33

投稿

firedfly
firedfly

スコア1133

answer CHANGED
@@ -6,4 +6,46 @@
6
6
   for a~d列ごと
7
7
    あるIDのある列の値がNanでも0でもないものを抽出
8
8
     そのうちの最古日付の値を保存(なければNan)
9
+ ```
10
+
11
+ 【追記】
12
+ 解決したようでなによりです。
13
+ サンプルを実装してみたので、こういう方法もありだなと思って頂ければ幸いです。
14
+ 以下、サンプルCSV、コード、結果出力。
15
+
16
+ ```csv
17
+ id date val
18
+ 1 2017-01-01 NaN
19
+ 1 2017-01-02 1
20
+ 2 2017-01-01 2
21
+ 2 2017-01-02 3
22
+ 3 2017-01-01 0
23
+ 3 2017-01-02 NaN
24
+ ```
25
+
26
+ ```Python
27
+ import pandas as pd
28
+
29
+ df = pd.read_csv('data.csv', delimiter='\t')
30
+ id_list = df.id.unique()
31
+
32
+ # 値が0かNaNの行を削除
33
+ df = df.loc[df.val != 0]
34
+ df = df.dropna()
35
+
36
+ for id in id_list:
37
+ df_id = df.loc[df.id == id] # idごとのDataFrame
38
+
39
+ if len(df_id) == 0:
40
+ print('id:{} is val:Nan'.format(id))
41
+ else:
42
+ # 日付が最小の行を抽出
43
+ min_row = df_id.loc[df_id.date == df_id.date.min()]
44
+ print('id:{} is val:{}'.format(id, min_row.values[0][2]))
45
+ ```
46
+
47
+ ```sh
48
+ id:1 is val:1.0
49
+ id:2 is val:2.0
50
+ id:3 is val:Nan
9
51
  ```