我有一个 2 列的数据框:名称和 ID 在名称列中,我有几个重复项,在 id 列中,重复项有一个空值 我想要的是用第一次迭代的值填充那个空值
例如:
df1=pd.DataFrame(columns=["name","id"])
df1["name"]=["a","b","c","a","d","e","b"]
df1["id"]=[1,2,3,"",4,5,""]
对于“a”和“b”的第二次迭代,我有一个空值 我想要的:
df1["id"]=[1,2,3,1,4,5,2]
如何用第一次迭代的值填充该空值?
答案 0 :(得分:6)
您可以按 .groupby()
对名称进行分组,并按 .transform('first')
获取每个组的第一个条目。然后用 .fillna()
替换同名组中的这些第一个条目的空字符串,如下所示:
df1['id'] = df1['id'].replace('', np.nan).fillna(df1.groupby('name')['id'].transform('first')).astype(int)
如果您的 id
列已经包含一些 NaN
值并且您不想触及这些值,您还可以使用 .mask()
有条件地将空字符串值替换为 { {1}} .transform('first')
值,如下所示:
groupby
结果:
df1['id'] = df1['id'].mask(df1['id'] == '', df1.groupby('name')['id'].transform('first'))
答案 1 :(得分:0)
更多groupby transform
选项来自
df1['id'] = np.where(
df1['id'].eq(''),
df1.groupby('name')['id'].transform('first'),
df1['id']
)
和loc
:
df1.loc[df1['id'].eq(''), 'id'] = df1.groupby('name')['id'].transform('first')
df1
:
name id
0 a 1
1 b 2
2 c 3
3 a 1
4 d 4
5 e 5
6 b 2