我有一个这样的数据框(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']]
但是,我很感兴趣是否可以通过更有效的方式解决此问题。请帮忙。谢谢。
答案 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