【问题标题】:replacing values in a pandas dataframe with values from another dataframe based common columns用来自另一个基于数据帧的公共列的值替换熊猫数据帧中的值
【发布时间】:2021-10-24 07:49:58
【问题描述】:

如何将 pandas 数据框中的值替换为另一个基于数据框的公共列中的值。

我需要根据“types”和“o_period”的公共列替换dataframe1中的NaN值。有什么建议吗?

df1

types  c_years  o_periods  s_months  incidents
0       1        1          1     127.0        0.0
1       1        1          2      63.0        0.0
2       1        2          1    1095.0        3.0
3       1        2          2    1095.0        4.0
4       1        3          1    1512.0        6.0
5       1        3          2    3353.0       18.0
6       1        4          1       NaN        NaN
7       1        4          2    2244.0       11.0
8       2        1          1   44882.0       39.0
9       2        1          2   17176.0       29.0
10      2        2          1   28609.0       58.0
11      2        2          2   20370.0       53.0
12      2        3          1    7064.0       12.0
13      2        3          2   13099.0       44.0
14      2        4          1       NaN        NaN
15      2        4          2    7117.0       18.0
16      3        1          1    1179.0        1.0
17      3        1          2     552.0        1.0
18      3        2          1     781.0        0.0
19      3        2          2     676.0        1.0
20      3        3          1     783.0        6.0
21      3        3          2    1948.0        2.0
22      3        4          1       NaN        NaN
23      3        4          2     274.0        1.0
24      4        1          1     251.0        0.0
25      4        1          2     105.0        0.0
26      4        2          1     288.0        0.0
27      4        2          2     192.0        0.0
28      4        3          1     349.0        2.0
29      4        3          2    1208.0       11.0
30      4        4          1       NaN        NaN
31      4        4          2    2051.0        4.0
32      5        1          1      45.0        0.0
33      5        1          2       NaN        NaN
34      5        2          1     789.0        7.0
35      5        2          2     437.0        7.0
36      5        3          1    1157.0        5.0
37      5        3          2    2161.0       12.0
38      5        4          1       NaN        NaN
39      5        4          2     542.0        1.0

df2

 types  o_periods  s_months  incidents
0      1          1     911.0        3.0
1      1          2    1689.0        8.0
2      2          1   26852.0       36.0
3      2          2   14440.0       36.0
4      3          1     914.0        2.0
5      3          2     862.0        1.0
6      4          1     296.0        1.0
7      4          2     889.0        4.0
8      5          1     664.0        4.0
9      5          2    1047.0        7.0

df3: 带有 NaN 的行

    types  c_years  o_periods  s_months  incidents
6       1        4          1       NaN        NaN
14      2        4          1       NaN        NaN
22      3        4          1       NaN        NaN
30      4        4          1       NaN        NaN
33      5        1          2       NaN        NaN
38      5        4          1       NaN        NaN

我尝试将 df2 与 df3 合并,但索引似乎已重置。

【问题讨论】:

  • 请不要发布图片。相反,请将您的数据(例如 print(df) 的输出直接复制到您的问题中。另外,请将您的预期输出与您尝试过的内容一起发布。
  • 如果您将 文本值 粘贴到 df1 和 df2 中的示例数据而不是屏幕截图,将会有所帮助。文本值可用于回答您的问题。

标签: python pandas dataframe


【解决方案1】:

首先将具有 NaN 值的行分离到一个名为 df3 的新数据框中,然后从 df1 中删除具有 NaN 值的行。

然后根据新的数据框进行左连接。

df4 = pd.merge(df3,df2,how='left',on=['types','o_period'])

完成后,将 df4 中的行追加回 df1。

另一种方法是将要查找的 2 列合并为一列

df1["types_o"] = df1["types_o"].astype(str) + df1["o_period"].astype(str)

df2["types_o"] = df2["types_o"].astype(str) + df2["o_period"].astype(str)

然后您可以查找缺失值。

df1.types_o.replace('Nan', np.NaN, inplace=True)

df1.loc[df1['s_months'].isnull(),'s_months'] = df2['types_o'].map(df1.types_o)

df1.loc[df1['incidents'].isnull(),'incidents'] = df2['types_o'].map(df1.types_o)

您没有粘贴任何易于复制的代码或数据示例,因此这是我能做的最好的。

【讨论】:

  • 嗨,我在名为 df3 的 df 中提取了具有 NaN 值的行。但是,当我尝试合并 df3 和 df2 时,行索引已重置。
  • 如果没关系对吧?因为您正在合并不同的列
  • 数据的顺序对你来说重要吗?如果是这样,您可以创建一个硬编码的索引列
  • 是的,我对索引进行了硬编码并将数据帧附加回来。不过谢谢你的帮助!!我用你的方法离开加入了 2 个数据框
  • 如果我的回答有帮助,请将其标记为正确,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-24
  • 2020-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多