Python 基于数据帧中两列的映射获取值
我有一个数据框架,有三列id、idcon和value。id变量是行的名称,idcon是它连接到的行的id,值是与id列关联的值。数据帧如下所示:Python 基于数据帧中两列的映射获取值,python,pandas,Python,Pandas,我有一个数据框架,有三列id、idcon和value。id变量是行的名称,idcon是它连接到的行的id,值是与id列关联的值。数据帧如下所示: import pandas as pd df = pd.DataFrame({'id': ['A', 'B', 'C'], 'idcon' : ['B', 'C', 'A'], 'value' : [1, 2, 3]}) 我正在寻找与id在同一行中的idcon关联的值。我可以通过创建i
import pandas as pd
df = pd.DataFrame({'id': ['A', 'B', 'C'],
'idcon' : ['B', 'C', 'A'],
'value' : [1, 2, 3]})
我正在寻找与id在同一行中的idcon关联的值。我可以通过创建id到idcon的字典和id到值的字典,然后在每一行上应用字典来实现这一点。我想知道是否有更好的方法来做这件事。代码和结果如下所示
print(df)
idcon = dict(zip(df.id, df.idcon))
idval = dict(zip(df.id, df.value))
df['conval'] = df.id.apply(lambda x: idval.get(idcon.get(x)))
print(df)
## id idcon value
##0 A B 1
##1 B C 2
##2 C A 3
## id idcon value conval
##0 A B 1 2
##1 B C 2 3
##2 C A 3 1
像这样使用合并:
df.merge(df.loc[:,('id','value')].rename(columns={'id':'idcon','value':'conval'}), on='idcon', how='left')
id idcon value conval
0 A B 1 2
1 B C 2 3
2 C A 3 1
像这样使用合并:
df.merge(df.loc[:,('id','value')].rename(columns={'id':'idcon','value':'conval'}), on='idcon', how='left')
id idcon value conval
0 A B 1 2
1 B C 2 3
2 C A 3 1
带有map的set_索引操作可以像@serialazer建议的那样工作;您还可以使用searchsorted。请注意,这项工作的唯一原因是idcon和id中的值相同,只是位置不同:
df["conval"] = df.iloc[df.id.searchsorted(df.idcon), -1].array
df
id idcon value conval
0 A B 1 2
1 B C 2 3
2 C A 3 1
这是@Serialazer的想法,效果很好:
df["conval"] = df.idcon.map(df.set_index("id").value)
带有map的set_索引操作可以像@serialazer建议的那样工作;您还可以使用searchsorted。请注意,这项工作的唯一原因是idcon和id中的值相同,只是位置不同:
df["conval"] = df.iloc[df.id.searchsorted(df.idcon), -1].array
df
id idcon value conval
0 A B 1 2
1 B C 2 3
2 C A 3 1
这是@Serialazer的想法,效果很好:
df["conval"] = df.idcon.map(df.set_index("id").value)
连接是最简单的方式:
df.set_index('idcon').join(df.set_index('id')['value'], rsuffix='_idcon')
合并也可以工作,但需要重命名列以避免冲突。连接是最简单的方法:
df.set_index('idcon').join(df.set_index('id')['value'], rsuffix='_idcon')
合并也可以工作,但需要重命名列以避免冲突。为什么不使用合并为什么不能简单地将索引重置为idcon?我可以看出这是一个XY问题。为什么需要将此列转换为conval?为什么不使用merge?为什么不能简单地将索引重置为idcon?我可以看出这是一个XY问题。你为什么要让这个专栏变成conval?