Python 用dataframe中另一列的相同值填充空值
我有一个熊猫数据框,如下所示: 如何使用相同产品类型的相同保单编号填充空单元格 如有任何建议,将不胜感激。多谢各位 很抱歉造成混淆,我现在正在添加示例数据帧: 样本=[{'POLICY NUMBER':'','PRODUCT TYPE':'MED'},{'POLICY NUMBER':'PRODUCT TYPE':'MED'},{'POLICY NUMBER':'433M49763','PRODUCT TYPE':'MED'},{'POLICY NUMBER':'','PRODUCT TYPE':'TED'},{'POLICY NUMBER':'566D158635','PRODUCT TYPE':'TED'},{'POLICY NUMBER':'655D1635','PRODUCT TED'},{'POLICY NUMBER':'789D158635','PRODUCT TYPE':'TED'}] pd.数据帧(示例) 请注意,空单元格中也有“”,它们在整个数据帧中不是NaN 添加到上面的问题。如果我有如上更改的数据帧。我如何获得以下数据帧: 我想你需要+: 如果每组只有一个相同类别且没有数据为空Python 用dataframe中另一列的相同值填充空值,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个熊猫数据框,如下所示: 如何使用相同产品类型的相同保单编号填充空单元格 如有任何建议,将不胜感激。多谢各位 很抱歉造成混淆,我现在正在添加示例数据帧: 样本=[{'POLICY NUMBER':'','PRODUCT TYPE':'MED'},{'POLICY NUMBER':'PRODUCT TYPE':'MED'},{'POLICY NUMBER':'433M49763','PRODUCT TYPE':'MED'},{'POLICY NUMBER':'','PRODUCT TYPE
string
s:
df['POLICY NUMBER'] = (df.groupby('PRODUCT TYPE')['POLICY NUMBER']
.transform(lambda x: x[x != ''].iat[0]))
print (df)
POLICY NUMBER PRODUCT TYPE
0 433M86968 MED
1 433M86968 MED
2 433M86968 MED
3 433M86968 MED
4 566D158635 TED
5 566D158635 TED
6 566D158635 TED
7 566D158635 TED
或者,如果可能的话,不一定总是有空的stings,但有时会有空白
,则需要:
带有排序和转换的解决方案last
值:
df['POLICY NUMBER'] = (df.sort_values(['PRODUCT TYPE','POLICY NUMBER'])
.groupby('PRODUCT TYPE')['POLICY NUMBER']
.transform('last'))
print (df)
POLICY NUMBER PRODUCT TYPE
0 433M86968 MED
1 433M86968 MED
2 433M86968 MED
3 433M86968 MED
4 566D158635 TED
5 566D158635 TED
6 566D158635 TED
7 566D158635 TED
编辑:您需要将空字符串替换为NaN
s,然后使用bfill
进行反向填充NaN
s,使用ffill
进行正向填充NaNs:
df['POLICY NUMBER'] = (df['POLICY NUMBER'].str.strip()
.replace('',np.nan)
.groupby(df['PRODUCT TYPE'])
.transform(lambda x: x.bfill().ffill()))
print (df)
POLICY NUMBER PRODUCT TYPE
0 433M49763 MED
1 433M49763 MED
2 433M49763 MED
3 433M86968 MED
4 566D158635 TED
5 566D158635 TED
6 566D158635 TED
7 789D158635 TED
我想你需要+:
如果每组只有一个相同类别且没有数据为空string
s:
df['POLICY NUMBER'] = (df.groupby('PRODUCT TYPE')['POLICY NUMBER']
.transform(lambda x: x[x != ''].iat[0]))
print (df)
POLICY NUMBER PRODUCT TYPE
0 433M86968 MED
1 433M86968 MED
2 433M86968 MED
3 433M86968 MED
4 566D158635 TED
5 566D158635 TED
6 566D158635 TED
7 566D158635 TED
或者,如果可能的话,不一定总是有空的stings,但有时会有空白
,则需要:
带有排序和转换的解决方案last
值:
df['POLICY NUMBER'] = (df.sort_values(['PRODUCT TYPE','POLICY NUMBER'])
.groupby('PRODUCT TYPE')['POLICY NUMBER']
.transform('last'))
print (df)
POLICY NUMBER PRODUCT TYPE
0 433M86968 MED
1 433M86968 MED
2 433M86968 MED
3 433M86968 MED
4 566D158635 TED
5 566D158635 TED
6 566D158635 TED
7 566D158635 TED
编辑:您需要将空字符串替换为NaN
s,然后使用bfill
进行反向填充NaN
s,使用ffill
进行正向填充NaNs:
df['POLICY NUMBER'] = (df['POLICY NUMBER'].str.strip()
.replace('',np.nan)
.groupby(df['PRODUCT TYPE'])
.transform(lambda x: x.bfill().ffill()))
print (df)
POLICY NUMBER PRODUCT TYPE
0 433M49763 MED
1 433M49763 MED
2 433M49763 MED
3 433M86968 MED
4 566D158635 TED
5 566D158635 TED
6 566D158635 TED
7 789D158635 TED
我认为不需要,也需要
groupby
df.groupby('Prod type')['Policy Number'].transform(lambda x:x.ffill().bfill())
@COLDSPEED,而不是确切的dupe,这是groupby和fillna,尽管我肯定也会有dupe,或者df.groupby('Prod type')['Policy Number'])。transform(lambda x:x.dropna().iat[0])
明白了,我不太确定,无法测试是因为没有样本df。非常感谢:)我认为没有,还需要groupby
df.groupby('Prod type')['Policy Number'].transform(lambda x:x.ffill().bfill())
@COLDSPEED,不是确切的dupe,这是groupby和fillna,尽管我确信也会有dupe,或者可能是df.groupby('Prod type')['Policy Number'].transform(lambda x:x.dropna().iat[0])
明白了,我不太确定,无法测试是因为没有样本df。非常感谢:)谢谢你的解决方案@jezrael。这是一个很大的帮助:)@jezrael…….我希望你能帮我解决同样问题的一个稍微修改的版本谢谢你的解决方案@jezrael。这是一个很大的帮助:)@jezrael…….我希望你能帮我一个小忙同一问题的修改版本