Python 在两个数据帧中查找相应的值
我必须在两个数据框中找到相应的值 输入: df1: df2: 输出应为:Python 在两个数据帧中查找相应的值,python,pandas,dataframe,Python,Pandas,Dataframe,我必须在两个数据框中找到相应的值 输入: df1: df2: 输出应为: system_in system_out count 0 sys1_in sys2_out 2 1 sys1_in sys3_out 1 2 sys1_in sys4_out 1 因此,我必须从两个DF构建一个DF,其中的列有in和out系统,其中有与
system_in system_out count
0 sys1_in sys2_out 2
1 sys1_in sys3_out 1
2 sys1_in sys4_out 1
因此,我必须从两个DF构建一个DF,其中的列有in和out系统,其中有与mesgID相关的
我用df.itertuples和df.goupby来制作:
model = pd.DataFrame(columns=['in', 'out', 'count'])
for item in ins.itertuples(index=True, name='Pandas'):
selected = outs.query('msgID == "%s"' % (getattr(item, "msgID")))
for row in selected.itertuples(index=True, name='Pandas2'):
model = model.append({'in': getattr(item, "system"), 'out': getattr(row, "system"), 'count': 1},
ignore_index=True)
result = model.groupby(['in', 'out'])['count'].sum().reset_index()
它可以工作,但效率很低,输入帧df1、df2大约有200万行。有人知道在熊猫框架中构建的更有效的方法吗
干杯 您可以通过先将数据帧按相应列合并,然后使用GroupBy with new in>=0.25.0来实现这一点: 输出 如果要保留列作为信息,只需使用merge和GroupBy.count: 输出
嗨,谢谢你的建议。它看起来很好,但我不能正确合并DFs。我总是空着的。不管我是使用条件,on=列,后缀=[''u in',''u out']还是不使用条件。有什么建议吗?嗨,尔凡,你能回答吗?我仍然无法合并两个DFs。
system_in system_out count
0 sys1_in sys2_out 2
1 sys1_in sys3_out 1
2 sys1_in sys4_out 1
model = pd.DataFrame(columns=['in', 'out', 'count'])
for item in ins.itertuples(index=True, name='Pandas'):
selected = outs.query('msgID == "%s"' % (getattr(item, "msgID")))
for row in selected.itertuples(index=True, name='Pandas2'):
model = model.append({'in': getattr(item, "system"), 'out': getattr(row, "system"), 'count': 1},
ignore_index=True)
result = model.groupby(['in', 'out'])['count'].sum().reset_index()
columns = [col for col in df1.columns if col != 'system']
mrg = df1.merge(df2, on=columns, suffixes=['_in', '_out'])
mrg.groupby(columns).agg(
system_in=('system_in', 'first'),
system_out=('system_out', 'first'),
count=('system_in', 'size')
).reset_index(drop=True)
system_in system_out count
0 sys1_in sys2_out 2
1 sys1_in sys3_out 1
2 sys1_in sys4_out 1
df1.merge(df2, on=columns, suffixes=['_in', '_out'])\
.groupby(columns, as_index=False).count()
server directions msgTYPE msgID count system_in system_out
0 1 in ADT MSG0001 1 2 2
1 1 in ADT MSG0003 1 1 1
2 1 in ADT MSG0004 1 1 1