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

时间:2017-11-14 18:10:39

标签: python pandas dataframe

我有一个像下面这样的pandas数据框:

enter image description here

如何使用相同的产品类型填充具有相同策略编号的空单元格?

非常感谢任何建议。谢谢

很抱歉这个混乱,我现在正在添加我的示例数据框:

  
    

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

添加上述问题。如果我有如上所述的更改数据帧。我如何进入以下数据框:

enter image description here

1 个答案:

答案 0 :(得分:1)

我认为您需要groupby + transform

如果每个组只有一个相同的类别且没有数据为空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