【问题标题】:Identifying similar values by iterating between two Pandas dataframes.通过在两个 Pandas 数据帧之间迭代来识别相似的值。
【发布时间】:2017-02-02 11:18:41
【问题描述】:

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

【问题讨论】:

    标签: python pandas dataframe data-analysis bigdata


    【解决方案1】:

    您可以在苹果列上执行左类型merge,然后可以在冲突列orange_xorange_y 上调用diff,然后使用- 反转符号并强制转换为@987654329 @使用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
    

    【讨论】:

    • 非常感谢。这正是我想要的。
    • 如果我的回答解决了你的问题,你可以接受,我的回答左上角会有一个空的勾号,这样问题就不会一直悬而未决。
    • 嗨,它确实有效。但是对于我的数据,所有列的差异都是 nan。但是,我可以看到 2 个数据帧中有匹配的值。 2 for 循环方法有效并给出结果。
    • 我无法评论你的真实数据,除非你发布它,我们只能回答摆在我们面前的东西和我们可以复制的东西。
    • 对不起,我完全理解。但是原始数据太大了,我已经进行了一些过滤和分析,得出了这两个数据框。我会看看我是否能找到错误或重新发布问题。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-17
    • 1970-01-01
    • 2020-02-24
    • 2018-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多