当df1中的键列与df2中的多个列匹配时,用另一个dataframe(df2)列中的值更新dataframe(df1)列

时间:2020-05-22 02:02:22

标签: python pandas dataframe

我有一个这样的数据框(df1)。

import pandas as pd
import numpy as np

d1 = {'A': [np.nan, 'India', 'CHN', 'JP'], 
      'B': [np.nan, np.nan, np.nan, np.nan]}

df1 = pd.DataFrame(data=d1)
df1
    A      B
0   NaN    NaN
1   India  NaN
2   CHN    NaN
3   JP     NaN

还有另一个像这样的数据框。

d2 = {'X': ['Japan', 'China', 'India'], 
      'Y': ['JP', 'CN', 'IN'], 
      'Z': ['JPN', 'CHN', 'IND']}

df2 = pd.DataFrame(data=d2)
df2
    X       Y   Z
0   Japan   JP  JPN
1   China   CN  CHN
2   India   IN  IND

我正在尝试更新df1的B列中的值,同时在df2的所有列中搜索df1的A列中的值,并在匹配时使用df2的X列中的值。

预期结果是:

    A       B
0   NaN     NaN
1   India   India
2   CHN     China
3   JP      Japan

我尝试使用内部联接(pd.merge()),但由于左侧有一列,右侧有3列,所以我走不远了。

pd.merge(df1, df2, left_on=["A"], right_on=["X"], how="inner")

我尝试使用isin().loc(),但是由于我需要使用df2中的值更新df1 ['B'],所以我不知道如何从df2中获取相应的数据。

df1.loc[
  (df1["A"].isin(df2["X"])) | 
  (df1["A"].isin(df2["Y"])) | 
  (df1["A"].isin(df2["Z"]))
]

我有一个想法,将每个列值存储为字典中的键,并将值分别作为df2 ['X']中的值存储。使用该字典作为df1 ['A']中每一行的查找,我可以更新df1 ['B']的值。

lookup_data = {
  "Japan" : "Japan",
  "JP" : "Japan",
  "JPN" : "Japan"
}
df1['B'] = [lookup_data.get(x, np.nan) for x in df1['A']]

但是,我很感兴趣是否可以通过更有效的方式解决此问题。请帮忙。谢谢。

2 个答案:

答案 0 :(得分:1)

这需要检查df1列A中df2中所有单元格的值,所以我们做

- name: Backup current config
  fortios_config:
    host: 192.168.0.254
    username: admin
    password: password
    backup: yes

- name: Backup only address objects
  fortios_config:
    host: 192.168.0.254
    username: admin
    password: password
    backup: yes
    backup_path: /tmp/forti_backup/
    filter: "firewall address"

- name: Update configuration from file
  fortios_config:
    host: 192.168.0.254
    username: admin
    password: password
    src: new_configuration.conf.j2

答案 1 :(得分:1)

您可以在df1的A列上使用map,并使用一系列索引,该索引为df2的所有值,并在df2列X中使用对应的值。 X列set_index,然后将值和索引转换为新的序列。

stack