【问题标题】:how to count the match number between two dataframe fast?如何快速计算两个数据帧之间的匹配数?
【发布时间】:2021-07-05 08:53:14
【问题描述】:

我正在编写一些程序来计算两个数据帧之间的匹配项数。

例如,

A is the dataframe as : A = pd.DataFrame({'pick_num1':[1, 2, 3], 'pick_num2':[2, 3, 4], 'pick_num3':[4, 5, 6]})


B is the answer I want to match, like:
B = pd.DataFrame({'ans_num1':[1, 2, 3], 'ans_num2':[2, 3, 4], 'ans_num3':[4, 5, 6], 'ans_num4':[7, 8, 1], 'ans_num5':[9, 1, 9]})


DataFrame A
   pick_num1  pick_num2  pick_num3  match_num
0          1          2          4          2
1          2          3          5          2
2          3          4          6          2
DataFrame B

   ans_num1  ans_num2  ans_num3  ans_num4  ans_num5
0         1         2         4         7         9
1         2         3         5         8         1
2         3         4         6         1         9

我想在 A 的末尾追加一个 ['match_num'] 的新列。

现在我试着写了一个映射函数来比较和计算,发现速度不是那么快,而数据帧很大,函数如下:

def win_prb_func(df1, p_name):
    df1['match_num'] += np.sum(pd.concat([df1[p_name]]*5, axis=1).values==df1[open_ball_name_ls].values, 1)
    return df1

def compute_win_prb(df1):
    return list(map(lambda p_name: win_prb_func(df1, p_name), pick_name_ls))

df1 = pd.concat([A, B], axis=1)
df1['win prb.'] = 0
result_df = compute_win_prb(df1)

其中pick_name_ls 是 ['pick_num1', 'pick_num2', 'pick_num3'],open_ball_name_ls 是 ['ans_num1', 'ans_num2', 'ans_num3', 'ans_num4', 'ans_num5']。

我想知道是否有可能使计算比我更快或更智能?

现在的性能是:0.015626192092895508 秒

谢谢你帮助我!

【问题讨论】:

    标签: python pandas dataframe performance


    【解决方案1】:

    您可以使用广播而不是连接列:

    def win_prb_func(df1, p_name):
        df1['match_num'] += np.sum(df1[p_name].values[:, np.newaxis] == df1[open_ball_name_ls].values, 1)
        return df1
    

    由于df1[p_name].values 将返回一维数组,因此您必须通过添加新轴将其转换为列向量。我只需要0.004 秒。

    【讨论】:

    • 真的,我也试过用 df1[p_name].values.reshape(-1, 1) ,性能比用 np.newaxis 广播稍慢,非常感谢!有没有可能更快,因为如果数据帧达到百万行,结果时间仍然很长。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-23
    • 2012-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-10
    相关资源
    最近更新 更多