Skip to main content
 首页 » 编程设计

python之通过在两个 Pandas 数据帧之间迭代来识别相似值。

2024年10月01日9leader

我有 2 个 Pandas 数据帧,它们的长度不等。我在下面引用了一个示例。我的代码应该遍历第一个数据框中苹果的值,并定位它是否存在于第二个数据框中(第二个数据框中始终存在一个值)。如果它找到相同的值,那么它应该将 2 个数据帧中橙子的差异存储到第一个数据帧中。我已经使用下面也给出的 2 个 for 循环执行了这个任务。下面的代码完成了任务,但我的实际数据有 200 万个条目,第二个数据框有 800 个条目。使用 2 个 for 循环会使我的程序变慢很多。 有没有更有效的方法来完成这项任务?

trial={'apples': [2,4,1,5,3,2,1,1,4,5],'oranges': [8,5,9,4,2,6,7,5,1,3]} 
trial1={'apples': [1,2,3,4,5],'oranges': [2,5,6,3,1]} 
df=pd.DataFrame.from_dict(trial) 
df1=pd.DataFrame.from_dict(trial1) 
F=[] 
for i in df.apples.index: 
    for j in df1.apples.index: 
        if  df.apples.ix[i]== df1.apples.ix[j]: 
           F.append(df.oranges.ix[i]-df1.oranges.ix[j])                  
df['difference']=F  

请您参考如下方法:

您可以在苹果列上执行左键入 merge,然后您可以在冲突列 orange_xorange_y 上调用 diff,然后使用 反转符号>- 并使用 astype 转换为 int :

In [159]: 
df['difference'] = -df.merge(df1, on='apples', how='left').ix[:, 'oranges_x':].diff(axis=1)['oranges_y'].astype(int) 
df 
 
Out[159]: 
   apples  oranges  difference 
0       2        8           3 
1       4        5           2 
2       1        9           7 
3       5        4           3 
4       3        2          -4 
5       2        6           1 
6       1        7           5 
7       1        5           3 
8       4        1          -2 
9       5        3           2 

分解以上内容:

In [162]: 
df.merge(df1, on='apples', how='left') 
 
Out[162]: 
   apples  oranges_x  oranges_y 
0       2          8          5 
1       4          5          3 
2       1          9          2 
3       5          4          1 
4       3          2          6 
5       2          6          5 
6       1          7          2 
7       1          5          2 
8       4          1          3 
9       5          3          1 
 
In [163]: 
df.merge(df1, on='apples', how='left').ix[:, 'oranges_x':].diff(axis=1) 
 
Out[163]: 
   oranges_x  oranges_y 
0        NaN       -3.0 
1        NaN       -2.0 
2        NaN       -7.0 
3        NaN       -3.0 
4        NaN        4.0 
5        NaN       -1.0 
6        NaN       -5.0 
7        NaN       -3.0 
8        NaN        2.0 
9        NaN       -2.0 
 
In [164]: 
-df.merge(df1, on='apples', how='left').ix[:, 'oranges_x':].diff(axis=1)['oranges_y'].astype(int) 
 
Out[164]: 
0    3 
1    2 
2    7 
3    3 
4   -4 
5    1 
6    5 
7    3 
8   -2 
9    2 
Name: oranges_y, dtype: int32 

如果您的真实数据有更多列,并且列顺序与您的示例不同,您可以在单独的步骤中执行此操作:

In [170]: 
merged = df.merge(df1, on='apples', how='left') 
merged['difference'] = merged['oranges_x'] - merged['oranges_y'] 
merged 
 
Out[170]: 
   apples  oranges_x  oranges_y  difference 
0       2          8          5           3 
1       4          5          3           2 
2       1          9          2           7 
3       5          4          1           3 
4       3          2          6          -4 
5       2          6          5           1 
6       1          7          2           5 
7       1          5          2           3 
8       4          1          3          -2 
9       5          3          1           2 

所以在合并之后,删除无关的列并重新命名:

In [171]:     
merged = merged.drop('oranges_y', axis=1).rename(columns={'oranges_x':'oranges'}) 
merged 
 
Out[171]: 
   apples  oranges  difference 
0       2        8           3 
1       4        5           2 
2       1        9           7 
3       5        4           3 
4       3        2          -4 
5       2        6           1 
6       1        7           5 
7       1        5           3 
8       4        1          -2 
9       5        3           2