Python 基于数据帧中两列的映射获取值

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

我有一个数据框架,有三列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关联的值。我可以通过创建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?