gpt4 book ai didi

python - Pandas,映射两个数据帧,根据条件进行计数

转载 作者:行者123 更新时间:2023-12-01 03:44:41 25 4
gpt4 key购买 nike

我已经编写了一些代码来映射两个数据帧的 id,如果条件匹配,则在现有数据帧的指定列中创建一个计数,我正在寻找一种更有效的计算方法。

示例数据

import numpy as np
import pandas as pd
d = {'ID' : pd.Series([111, 222, 111, 444, 222, 111]), 'Tag' : pd.Series([1, 2, 3, 1, 2, 1])}
df1 = (pd.DataFrame(d))
print(df1)

ID Tag
0 111 1
1 222 2
2 111 3
3 444 1
4 222 2
5 111 1

d = {'ID' : pd.Series([111, 444, 666, 444, 777])}
df2 = (pd.DataFrame(d))
print(df2)
ID
0 111
1 444
2 666
3 444
4 777

df2['tag1'] = 0
df2['tag2'] = 0
df2['tag3'] = 0

for index, row in df2.iterrows():
for i, t in df1.iterrows():
if row['ID'] == t['ID']:
if t['Tag'] == 1:
df2.loc[index]["tag1"] += 1
elif t['Tag'] == 2:
df2.loc[index]["tag2"] += 1
elif t['Tag'] == 3:
df2.loc[index]["tag3"] += 1

输出

print(df2)
ID tag1 tag2 tag3
0 111 2 0 1
1 444 1 0 0
2 666 0 0 0
3 444 1 0 0
4 777 0 0 0

除了迭代计算之外,最有效的方法是什么?

请注意,df1 可以多次包含示例 ID 以及不同的 Tag

(df1和df2是大型数据帧,df1中有50,000行,df2中有15,000行)

最佳答案

您可以使用crosstabmerge :

print (pd.crosstab(df1.ID, df1.Tag))   
Tag 1 2 3
ID
111 2 0 1
222 0 2 0
444 1 0 0

print (pd.merge(df2, pd.crosstab(df1.ID, df1.Tag)
.add_prefix('tag')
.reset_index(), on='ID', how='left')
.fillna(0)
.astype(int))

ID tag1 tag2 tag3
0 111 2 0 1
1 444 1 0 0
2 666 0 0 0
3 444 1 0 0
4 777 0 0 0

您可以使用 groupby 来代替 crosstabsizeunstack :

print (df1.groupby(['ID', 'Tag'])['Tag'].size().unstack())   
Tag 1 2 3
ID
111 2.0 NaN 1.0
222 NaN 2.0 NaN
444 1.0 NaN NaN

print (pd.merge(df2, df1.groupby(['ID', 'Tag'])['Tag'].size().unstack()
.add_prefix('tag')
.reset_index(), on='ID', how='left')
.fillna(0)
.astype(int))

ID tag1 tag2 tag3
0 111 2 0 1
1 444 1 0 0
2 666 0 0 0
3 444 1 0 0
4 777 0 0 0

关于python - Pandas,映射两个数据帧,根据条件进行计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39104928/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com