我有一个数据集,我需要有条件地填充,并带有来自适当groupby的第一个值,但是我无法弄清楚。
import numpy as np
import pandas as pd
df_dict = {
'id':[1, 1, 1, 1, 2, 2, 2, 2],
'data':['A', np.nan, np.nan, np.nan, 'B', np.nan, np.nan, np.nan, 'C', np.nan, np.nan]
}
df = pd.DataFrame(df_dict)
我需要创建一个如下所示的数据框:
final_dict = {
'id':[1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2],
'data':['A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'C', 'C', 'C']
}
final = pd.DataFrame(final_dict)
我的本能是将id
分组,然后执行.fillna(something)
,但我不知道该怎么做。
我尝试过
df.groupby('id')['data'].fillna(df['data'].first_valid_index())
但这会放置0
而不是复制我想要的内容。
我还有另一个部分解决方案:
for col_name, data in df.items():
df[col_name] = df.groupby('id').apply(
lambda x: x[col_name].fillna(x.loc[x[col_name].last_valid_index(), col_name])
).reset_index(drop=True)
答案 0 :(得分:2)
fillna
,transform
,first
df.fillna({'data': df.groupby('id')['data'].transform('first')})
data id
0 A 1
1 A 1
2 A 1
3 A 1
4 B 2
5 B 2
6 B 2
7 B 2
transform
在每个组中获取内容,然后在组中进行广播'first'
获取每个组的第一个有效值fillna
带了一个字典,您可以在其中指定要用什么填充的列答案 1 :(得分:2)
pandas的X<int>
具有为我们执行此操作的方法:
X<float>
正是我想要的。