首页 > 解决方案 > 如何在一个 pandas 数据帧的行中的 ID 组并使用它们从另一个数据帧中提取记录

问题描述

我有两个数据框。一个包含个人和家庭的联系信息。另一个包含一个家庭的 ID 字段,后跟该家庭中的个人。我想从第一个数据框中选择所有记录并插入一列及其关联的家庭 ID。

最小可重复性:

df1 = pd.DataFrame({'Constituent Id':['111111','222222','333333','444444','555555','666666','777777'],
               'Type':['Individual','Household','Individual','Household',
                       'Individual','Individual','Individual'],
               'Name':['Panda Smith','Panda and Python','Python Jones','Postgres Family',
                       'Paul Postgres','Mary Postgres','Sqlite Postgres']})

df2 = pd.DataFrame({'Account_ID':['ABCDEF','GHIJKL'],
                    'Household_0':['222222','444444'],
                    'Individual_0':['111111','555555'],
                    'Individual_1':['333333','666666'],
                    'Individual_2':['','777777']})

导致:

 >>> df1
      Constituent Id        Type              Name
    0         111111  Individual       Panda Smith
    1         222222   Household  Panda and Python
    2         333333  Individual      Python Jones
    3         444444   Household   Postgres Family
    4         555555  Individual     Paul Postgres
    5         666666  Individual     Mary Postgres
    6         777777  Individual   Sqlite Postgres
>>> df2
      Account_ID Household_0 Individual_0 Individual_1 Individual_2
    0     ABCDEF      222222       111111       333333             
    1     GHIJKL      444444       555555       666666       777777

我想要做的是附加一列,df1该列Account_ID适用于帐户中的每个人。家庭不是必需的,但如果我包括这些就可以了。

因为每个家庭的人数各不相同,所以如果不遍历每一行,我想不出一个很好的方法来做到这一点。这似乎很不熊猫,我相信有更好的方法,也许是通过堆叠或其他方式。

在我的示例中,输出如下所示:

  Constituent Id        Type              Name   Account_ID  
0         111111  Individual       Panda Smith      ABCDEF
1         222222   Household  Panda and Python      ABCDEF
2         333333  Individual      Python Jones      ABCDEF
3         444444   Household   Postgres Family      GHIJKL
4         555555  Individual     Paul Postgres      GHIJKL
5         666666  Individual     Mary Postgres      GHIJKL
6         777777  Individual   Sqlite Postgres      GHIJKL

标签: pythonpandasdataframe

解决方案


melt那么IIUC需要merge

如果 。Type不是必需的,您可以从第二行和合并子句中省略它。

s = pd.melt(df2,id_vars='Account_ID',var_name='Type',value_name='Constituent Id')
s['Type'] = s['Type'].str.split('_',expand=True)[0]

print(s.head(5))
  Account_ID        Type Constituent Id
0     ABCDEF   Household         222222
1     GHIJKL   Household         444444
2     ABCDEF  Individual         111111
3     GHIJKL  Individual         555555
4     ABCDEF  Individual         333333

df3 = pd.merge(df1,
         s,
         on=['Type','Constituent Id'],
         how='left'
        )

print(df3)

  Constituent Id        Type              Name Account_ID
0         111111  Individual       Panda Smith     ABCDEF
1         222222   Household  Panda and Python     ABCDEF
2         333333  Individual      Python Jones     ABCDEF
3         444444   Household   Postgres Family     GHIJKL
4         555555  Individual     Paul Postgres     GHIJKL
5         666666  Individual     Mary Postgres     GHIJKL
6         777777  Individual   Sqlite Postgres     GHIJKL

推荐阅读