繁体   English   中英

如果多列匹配字典中的值,则用一个值填充数据框列

[英]Fill dataframe column with a value if multiple columns match values in a dictionary

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

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

缺失值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 语句,是否可以干净利落地做到这一点?

谢谢!

尝试:

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

这行得通吗?

>>> 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+')

我将缺失值 df 称为:df 和字典 df 为:ddf,将两者都视为数据帧

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM