Python 用dataframe中另一列的相同值填充空值

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

我有一个熊猫数据框,如下所示:

如何使用相同产品类型的相同保单编号填充空单元格

如有任何建议,将不胜感激。多谢各位

很抱歉造成混淆,我现在正在添加示例数据帧:

样本=[{'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

添加到上面的问题。如果我有如上更改的数据帧。我如何获得以下数据帧:

我想你需要+:

如果每组只有一个相同类别且没有数据为空
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…….我希望你能帮我一个小忙同一问题的修改版本