Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.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,我必须在两个数据框中找到相应的值 输入: 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系统,其中有与

我必须在两个数据框中找到相应的值

输入: 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系统,其中有与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