【问题标题】:Fill dataframe column with a value if multiple columns match values in a dictionary如果多个列与字典中的值匹配,则用值填充数据框列
【发布时间】:2020-02-23 20:56:51
【问题描述】:

我有两个数据框 - 一个包含多个分类列的大型数据框和一个包含缺失值的列,另一个是具有相同分类列和一个具有键值的列的字典。

本质上,如果所有分类列都匹配,我想用第二个中的键值填充大型数据框中的缺失值。

缺失值df:

    Color      Number    Letter       Value
0   Red          2          B          NaN
1   Green        2          A          NaN 
2   Red          2          B          NaN
3   Red          1          B          NaN
4   Green        1          A          NaN
5   Red          2          B          NaN
6   Green        1          B          NaN
7   Green        2          A          NaN

字典df:

    Color      Number    Letter       Value
0   Red          1          A          10
1   Red          1          B           4
2   Red          2          A           3
3   Red          2          B          15
4   Green        1          A          21
5   Green        1          B           9
6   Green        2          A          22
7   Green        2          B           1

所需的df:

0   Red          2          B          15
1   Green        2          A          22 
2   Red          2          B          15
3   Red          1          B          4
4   Green        1          A          21
5   Red          2          B          15
6   Green        1          B          9
7   Green        2          A          22

我不确定是否应该将“字典 df”作为实际字典,还是将其保留为数据框(从 csv 中提取)。

这是否可以在没有无数 if else 语句的情况下干净地完成?

谢谢!

【问题讨论】:

  • 您想将 Dictionary df 的 value 列中的观察结果填充到 Missing value df 对吗?
  • 没错。

标签: python pandas dataframe dictionary


【解决方案1】:

这行得通吗?

>>> df_1[['Color', 'Number', 'Letter']].merge(df_2, 
...                                           on=('Color', 'Number', 'Letter'),   
...                                           how='left')
   Color  Number Letter  Value
0    Red       2      B     15
1  Green       2      A     22
2    Red       2      B     15
3    Red       1      B      4
4  Green       1      A     21
5    Red       2      B     15
6  Green       1      B      9
7  Green       2      A     22

认为值得一提 - 一种将 stackoverflow pandas 问题中的示例转换为数据框的非常简单的方法,只需将其剪切并粘贴到这样的字符串中:

>>> df_1 = pd.read_csv(StringIO("""
...     Color      Number    Letter       Value
... 0   Red          2          B          NaN
... 1   Green        2          A          NaN
... 2   Red          2          B          NaN
... 3   Red          1          B          NaN
... 4   Green        1          A          NaN
... 5   Red          2          B          NaN
... 6   Green        1          B          NaN
... 7   Green        2          A          NaN
... """), sep=r'\s+')

【讨论】:

    【解决方案2】:

    试试:

    missing_df.reset_index()[['index', 'Color', 'Number', 'Letter']]\
              .merge(dict_df, on = ['Color', 'Number', 'Letter'])\
              .set_index('index').reindex(missing_df.index)
    

    输出:

      Color  Number Letter  Value
    0    Red       2      B     15
    1  Green       2      A     22
    2    Red       2      B     15
    3    Red       1      B      4
    4  Green       1      A     21
    5    Red       2      B     15
    6  Green       1      B      9
    7  Green       2      A     22
    

    【讨论】:

      【解决方案3】:

      我会打电话的 缺失值df为:df 和 Dictionary df as:ddf,将两者都视为数据帧

      首先从缺失值df中删除空值列:

      df.drop(['Value'], axis=1)
      
      

      第二次运行下面的命令,它应该会为你完成任务。

      df.assign(Value=ddf['Value'])
      

      【讨论】:

      • 这并没有完全返回我想要的东西。这确实返回了带有值的 df,但不是对应于不同颜色、数字、字母组合的正确值。
      猜你喜欢
      • 1970-01-01
      • 2020-09-10
      • 2021-01-20
      • 1970-01-01
      • 2022-11-13
      • 1970-01-01
      • 2021-07-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多