データフレーム内の数値の欠落値を埋めようとしています。各変数グループには1から100の範囲の日付があり、日付が100に達すると、一部の変数には1から始まる日付の2番目のサイクルがあります。変数内ではdate
繰り返し可能です。1から100までの数字を入力する必要があります。たとえば、Aの値は1、2、3、3、4、5、6、10で、ここでも1、2、3、3、4です。私はそれらが1,2,3,3,4,5,6,7,8,9,10,11,12,13,14 ......... 100そして再び1,2である必要があります、 3,3,4,5,6,7,8,9,10,11,12,13,14 ......... 100。日付を入力するときにNaN
、残りの列に入力したいと思います。
df = pd.DataFrame({"date": [1,2,3,3,4,5,6,10,1,2,3,3,4,1,1,1,4,4,4,1,1,1,2,2,3,3,3,4,4],
"var": ["A","A","A", "A", "A", "A","A","A","A", "A", "A","A","A", "B", "B", "B","B","B","B" ,"C", "C", "C","C", "D","D","D","D","D","D"],
"no": [ 1.5, 1.5,1, 2.2, 3.5, 1.5, 1.5, 1.2, 1.3, 1.1, 2, 3,1, 2.2, 3.5, 1.5, 1.5, 1.2, 1.3, 1.1, 2, 3,9,1.2, 1.3, 1.1, 2, 3,9],
"value": [ -1.135632, 1.212112,0.469112, -0.282863, -1.509059, -1.135632, 1.212112, -0.173215,
0.119209, -1.044236, -0.861849, None,0.469112, -0.282863, -1.509059, -1.135632, 1.212112, -0.173215,
0.119209, -1.044236, -0.861849, None,0.87,1.2, 1.3, 1.1, 2, 3,9]})
date var no value
0 1 A 1.5 -1.135632
1 2 A 1.5 1.212112
2 3 A 1.0 0.469112
3 3 A 2.2 -0.282863
4 4 A 3.5 -1.509059
5 5 A 1.5 -1.135632
6 6 A 1.5 1.212112
7 10 A 1.2 -0.173215
8 1 A 1.3 0.119209
9 2 A 1.1 -1.044236
10 3 A 2.0 -0.861849
11 3 A 3.0 NaN
12 4 A 1.0 0.469112
13 1 B 2.2 -0.282863
14 1 B 3.5 -1.509059
15 1 B 1.5 -1.135632
16 4 B 1.5 1.212112
17 4 B 1.2 -0.173215
18 4 B 1.3 0.119209
19 1 C 1.1 -1.044236
20 1 C 2.0 -0.861849
21 1 C 3.0 NaN
22 2 C 9.0 0.870000
23 2 D 1.2 1.200000
24 3 D 1.3 1.300000
25 3 D 1.1 1.100000
26 3 D 2.0 2.000000
27 4 D 3.0 3.000000
28 4 D 9.0 9.000000
必要な出力は次のようになります。
date var no value
1 A 1.5 -1.135632
2 A 1.5 1.212112
3 A 1.0 0.469112
3 A 2.2 -0.282863
4 A 3.5 -1.509059
5 A 1.5 -1.135632
6 A 1.5 1.212112
7 A NaN NaN
8 A NaN NaN
9 A NaN NaN
. . .... ..........
. . .... ..........
. . .... ..........
100 A 1.2 -0.173215
これは1つのグループのほんの一例です。このようなグループは少なくとも300あり、データフレームには合計100,000行あります。ここでは、日付3が繰り返されていますが、そのままにしておく必要があります。助けてください!
改訂された回答:
import pandas as pd
from numpy import nan
df = pd.DataFrame({"date": [1,2,3,3,4,5,6,10,1,2,3,3,4,1,1,1,4,4,4,1,1,1,2,2,3,3,3,4,4],
"var": ["A","A","A", "A", "A", "A","A","A","A", "A", "A","A","A", "B", "B", "B","B","B","B" ,"C", "C", "C","C", "D","D","D","D","D","D"],
"no": [ 1.5, 1.5,1, 2.2, 3.5, 1.5, 1.5, 1.2, 1.3, 1.1, 2, 3,1, 2.2, 3.5, 1.5, 1.5, 1.2, 1.3, 1.1, 2, 3,9,1.2, 1.3, 1.1, 2, 3,9],
"value": [ -1.135632, 1.212112,0.469112, -0.282863, -1.509059, -1.135632, 1.212112, -0.173215,
0.119209, -1.044236, -0.861849, None,0.469112, -0.282863, -1.509059, -1.135632, 1.212112, -0.173215,
0.119209, -1.044236, -0.861849, None,0.87,1.2, 1.3, 1.1, 2, 3,9]})
group_ident=[]
for df_group_index in df['var']:
if df_group_index in group_ident:
pass
else:
group_ident.append(df_group_index)
counter=[0 for i in range(len(group_ident))]
df_default=pd.DataFrame({"date":[i for i in range(len(df))],
"var":["A" for i in range(len(df))],
"no":[nan for i in range(len(df))],
"value":[nan for i in range(len(df))]})
for index in range(len(df_default)):
date_case=0
if df['date'][index]<counter[group_ident.index(df['var'][index])]:
date_case=counter[group_ident.index(df['var'][index])]+df['date'][index]
else:
date_case=df['date'][index]
counter[group_ident.index(df['var'][index])]=df['date'][index]
print('date case = ' +str(date_case))
print(counter[group_ident.index(df['var'][index])])
for key in df:
if key == 'date':
df_default[key][index]=date_case
else:
df_default[key][index]=df[key][index]
print(df_default)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加