【问题标题】:fill up empty values with same value of another column in pandas dataframe用熊猫数据框中另一列的相同值填充空值
【发布时间】:2017-11-15 05:16:20
【问题描述】:

我有一个如下所示的 pandas 数据框:

对于现有的相同产品类型,如何使用相同的保单编号填充空白单元格?

任何建议将不胜感激。谢谢

对不起,我现在添加我的示例数据框:

sample=[{'POLICY NUMBER':' ','PRODUCT TYPE':'MED'},{'POLICY NUMBER':' ','PRODUCT TYPE':'MED'},{'POLICY NUMBER': '433M49763','产品类型':'MED'},{'政策编号':'433M86968','产品类型':'MED'},{'政策编号':' ','产品类型':'TED '},{'政策编号':'566D158635','产品类型':'TED'},{'政策编号':'655D158635','产品类型':'TED'},{'政策编号':' 789D158635','产品类型':'TED'}]

pd.DataFrame(样本)

请注意,空单元格中也有“”,它们不是整个数据帧中的 NaN

补充上面的问题。如果我有上述更改的数据框。我如何获得以下数据框:

【问题讨论】:

  • 我觉得不需要,还需要groupby
  • df.groupby('Prod type')['Policy Number'].transform(lambda x: x.ffill().bfill())
  • @COLDSPEED,不完全是骗局,这个是 groupby 和 fillna,尽管我相信也会有骗局
  • 或者df.groupby('Prod type')['Policy Number'].transform(lambda x: x.dropna().iat[0])
  • 知道了,我不太确定,无法测试是因为没有样本 df。非常感谢:)

标签: python pandas dataframe


【解决方案1】:

我认为你需要groupby + transform

如果每组只有一个相同的类别并且没有数据为空strings:

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

编辑:您需要用NaNs 替换空字符串,然后使用bfill 向后填充NaNs,用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  

【讨论】:

  • 感谢@jezrael 的解决方案。这是一个很大的帮助:)
  • @jezrael.......我希望你能帮助我解决相同问题的稍微修改版本
猜你喜欢
  • 1970-01-01
  • 2020-11-19
  • 1970-01-01
  • 2020-11-26
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
  • 2019-11-30
  • 2019-06-05
相关资源
最近更新 更多