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

标签 python pandas dataframe data-analysis bigdata

我有 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 

最佳答案

您可以在 apples 列上执行 left type merge ,然后可以在冲突的列 difforange_x 上调用 orange_y ,然后使用 - 反转符号并使用 int 转换为 astype :

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

关于python - 通过在两个 Pandas 数据帧之间迭代来识别相似的值。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42000839/

相关文章:

python - Tensorflow 1.4 tf.metrics.auc 用于AUC计算

python - pandas 将多索引重新索引为更高频率的日期

python - 在 Pandas 数据帧之间寻找最接近的值

python - 为 pandas 数据框均匀分配随机值

python - 我如何解决 future 的警告 -> % (min_groups, self.n_splits)), Warning) in python?

python - 使用 Doxygen 记录 UTF-8 Python 代码

python - Pandas 根据其他行的和/差添加新行

python - 在 'df.size()' 函数后操作新列?

python - 合并具有许多稀疏列的两个 Pandas DataFrame 会导致 DataFrame 需要不成比例的大量内存

python - Pytorch:如何将 L1 正则化器添加到激活中?