python - 如何在一个 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
解决方案
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
推荐阅读
- android - 如何解决从 android 应用程序使用 wamp 服务器连接 MySQL 的端口 80 问题?
- css - 删除静态文件后,Django css不再用于打印
- json - AWS Step Function - 将动态值添加到传递状态类型
- node.js - 使用 mangoDB 运行 node.js 时出现错误
- php - 仅在商店中用 woocommerce 中的贝宝结帐替换添加到购物车按钮
- jekyll - 将 bigimg 添加到 beautiful-jekyll
- javascript - 如何删除 [vue/no-use-v-if-with-v-for] 警告?
- javascript - 如何减少json数据
- ios - 导出的 tflite 模型预测不正确的输出
- javascript - Javascript 如何避免无限回调调用?