我有一个像下面这样的pandas数据框:
如何使用相同的产品类型填充具有相同策略编号的空单元格?
非常感谢任何建议。谢谢
很抱歉这个混乱,我现在正在添加我的示例数据框:
sample = [{'POLICY NUMBER':'','PRODUCT TYPE':'MED'},{'POLICY NUMBER':'','PRODUCT TYPE':'MED'},{'POLICY NUMBER': '433M49763','产品类型':'MED'},{'POLICY NUMBER':'433M86968','产品类型':'MED'},{'政策号码':'','产品类型':'TED '},{'POLICY NUMBER':'566D158635','PRODUCT TYPE':'TED'},{'POLICY NUMBER':'655D158635','PRODUCT TYPE':'TED'},{'POLICY NUMBER':' 789D158635','产品类型':'TED'}]
pd.DataFrame(样品)
请注意,空单元格中也有“”,在整个数据框中它们不是NaN
添加上述问题。如果我有如上所述的更改数据帧。我如何进入以下数据框:
答案 0 :(得分:1)
如果每个组只有一个相同的类别且没有数据为空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
或者如果可能的话并不总是空洞的叮咬,但有时会有wtrailing whitespaces
,需要strip
:
df['POLICY NUMBER'] = (df['POLICY NUMBER'].str.strip().groupby(df['PRODUCT TYPE'])
.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
排序和转换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
之前替换空字符串,然后使用bfill
向后转发NaN
ffill
用于转发填充NaN:
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