Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从一个数据帧获取行值,并将其用作从另一个数据帧获取值的引用_Python_Pandas_Dataframe - Fatal编程技术网

Python 如何从一个数据帧获取行值,并将其用作从另一个数据帧获取值的引用

Python 如何从一个数据帧获取行值,并将其用作从另一个数据帧获取值的引用,python,pandas,dataframe,Python,Pandas,Dataframe,我有两个数据帧。一个包含成分的联系信息。另一个是为了将可能属于同一个家庭的成分配对而创建的 样本: data1 = {'Household_0':['1234567','2345678','3456789','4567890'], 'Individual_0':['1111111','2222222','3333333','4444444'], 'Individual_1':['5555555','6666666','7777777','']} df1=pd.Da

我有两个数据帧。一个包含成分的联系信息。另一个是为了将可能属于同一个家庭的成分配对而创建的

样本:

data1 = {'Household_0':['1234567','2345678','3456789','4567890'],
        'Individual_0':['1111111','2222222','3333333','4444444'],
        'Individual_1':['5555555','6666666','7777777','']}
df1=pd.DataFrame(data1)

data2 = {'Constituent Id':['1234567','2345678','3456789','4567890',
                           '1111111','2222222','3333333','4444444',
                           '5555555','6666666','7777777'],
         'Display Name':['Clark Kent and Lois Lane','Bruce Banner and Betty Ross',
                         'Tony Stark and Pepper Pots','Steve Rogers','Clark Kent','Bruce Banner',
                         'Tony Stark','Steve Rogers','Lois Lane','Betty Ross','Pepper Pots']}
df2=pd.DataFrame(data2)
导致:

df1
  Household_0 Individual_0 Individual_1
0     1234567      1111111      5555555
1     2345678      2222222      6666666
2     3456789      3333333      7777777
3     4567890      4444444     

df2
   Constituent Id                 Display Name
0         1234567     Clark Kent and Lois Lane
1         2345678  Bruce Banner and Betty Ross
2         3456789   Tony Stark and Pepper Pots
3         4567890                 Steve Rogers
4         1111111                   Clark Kent
5         2222222                 Bruce Banner
6         3333333                   Tony Stark
7         4444444                 Steve Rogers
8         5555555                    Lois Lane
9         6666666                   Betty Ross
10        7777777                  Pepper Pots
我想使用df1,引用df2中的
成分Id
,并创建一个新的数据框架,其中包含成分的名称而不是其Id,以便我们能够确保他们是真正的家庭成员


我相信我可以通过迭代来做到这一点,但这似乎是错误的方法。有一种简单的方法可以做到这一点吗?

您可以使用基于
df2
的系列
映射
df1
中的每个列
一次
设置索引
成分Id并选择列显示名称。使用
apply
对每列重复该操作

print (df1.apply(lambda x: x.map(df2.set_index('Constituent Id')['Display Name'])))
                   Household_0  Individual_0 Individual_1
0     Clark Kent and Lois Lane    Clark Kent    Lois Lane
1  Bruce Banner and Betty Ross  Bruce Banner   Betty Ross
2   Tony Stark and Pepper Pots    Tony Stark  Pepper Pots
3                 Steve Rogers  Steve Rogers          NaN

您可以通过管道
melt
merge
pivot\u表

df3 = (
    df1
    .reset_index()
    .melt('index')
    .merge(df2, left_on='value', right_on='Constituent Id')
    .pivot_table(values='Display Name', index='index', columns='variable', aggfunc='last')
)
print(df3)
输出

variable                  Household_0  Individual_0 Individual_1
index                                                           
0            Clark Kent and Lois Lane    Clark Kent    Lois Lane
1         Bruce Banner and Betty Ross  Bruce Banner   Betty Ross
2          Tony Stark and Pepper Pots    Tony Stark  Pepper Pots
3                        Steve Rogers  Steve Rogers          NaN

您还可以尝试使用
.applymap()
将两者链接在一起

reference = df2.set_index('Constituent Id')['Display Name'].to_dict()
df1[df1.columns] = df1[df1.columns].applymap(reference.get)

基本上,您希望将
df2
中的所有名称合并起来,以替换5x3数据帧
df1
中的Id,您只需拆分具有
的值,并过滤Id。这非常简洁,适用于不包含Marvel字符的较大数据集。多谢。