python - 尝试将 df1 中的每一行与 df1 中的多个其他行进行匹配

标签 python pandas dataframe optimization tuples

所以我想弄清楚如何加快这个操作。目前,真正的数据集需要大约一个小时来迭代(df1 和 df2 中的约 50,000 列),这似乎不太实用。有人有什么建议吗?即 Pandas 矢量化, Pandas 条件等?
基本操作:查看df1中的每一行,并与df2中的每一行进行比较。如果 agent_id 匹配并且 df1 'created_at_email' 日期大于或等于 df2 'created_at' 日期,则拉出该行。 df1 编辑中每行允许拉取的最大行数为 4:首先按最近日期排序。
示例数据帧:

df1 = pd.DataFrame({'unique_col': ['a', 'b', 'c', 'd', 'e', 'f', 'g'], 
                    'agent_id': [1, 2, 3, 1, 5, 6, 7], 
                    'created_at_email': ['1/5/2020', '1/6/2020', '1/8/2020', '1/3/2020', '1/4/2020', '1/7/2020', '1/2/2020']
                   })

df2 = pd.DataFrame({'unique_col': ['a', 'b', 'c', 'd', 'e', 'f', 'g'], 
                    'agent_id': [1, 1, 3, 1, 1, 1, 1], 
                    'created_at': ['1/4/2020', '1/5/2020', '1/6/2020', '1/9/2020', '1/2/2020', '1/3/2020', '1/4/2020']
                   })
代码(需要加速):
# pre-sorting order created at column so function will iterate from most recent to least recent orders.
df2 = df2.sort_values(['created_at'], ascending=False)



# note: super not optimized
obj = []
for row in df1.itertuples():
    count = 0
    for row2 in df2.itertuples():
        if row[2] == row2[2]:
            if row2[3] <= row[3]:
                if count < 4: # returns the first 4 entries
                    c = [row2[3], row[3], row2[2], row[2], row[1], row2[1]]
                    obj.append(c)
                    count = count + 1

输出:(它应该是什么样子)...
注意:df1 可以有多个相同的 agent_id,df2 也可以。
注意:右侧的日期大于或等于左侧的日期。
注意:unique_ids 仅用于检查所有内容是否一致。
cols: created_at, created_at_email, agent_id, agent_id, unique_id, unique_id 

[['1/5/2020', '1/5/2020', 1, 1, 'a', 'b'],
 ['1/4/2020', '1/5/2020', 1, 1, 'a', 'a'],
 ['1/4/2020', '1/5/2020', 1, 1, 'a', 'g'],
 ['1/3/2020', '1/5/2020', 1, 1, 'a', 'f'],
 ['1/6/2020', '1/8/2020', 3, 3, 'c', 'c'],
 ['1/3/2020', '1/3/2020', 1, 1, 'd', 'f'],
 ['1/2/2020', '1/3/2020', 1, 1, 'd', 'e']]

谢谢,

最佳答案

一个 merge会更快。不过,我不确定是否合并两个 50k 数据帧:

(df1.assign(row=np.arange(len(df1)))          # record the row number in `df1`
    .merge(df2, on=['agent_id'])
    .query('created_at_email >= created_at')  # select rows with greater creat_at_email
    .groupby('row').head(4)                   # select max 4 rows for each row in df1
)
输出:
   unique_col_x  agent_id created_at_email  row unique_col_y created_at
0             a         1         1/5/2020    0            a   1/4/2020
1             a         1         1/5/2020    0            b   1/5/2020
3             a         1         1/5/2020    0            e   1/2/2020
4             a         1         1/5/2020    0            f   1/3/2020
9             d         1         1/3/2020    3            e   1/2/2020
10            d         1         1/3/2020    3            f   1/3/2020
12            c         3         1/8/2020    2            c   1/6/2020

关于python - 尝试将 df1 中的每一行与 df1 中的多个其他行进行匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65331540/

相关文章:

python - 如何在 Gensim Word2Vec 中手动更改单词的向量维度

python - 在 DataFrame 中使用正则表达式 - 最后 5 个字符

python - 根据包含条件屏蔽 Pandas DataFrame

python - Pandas Dataframe 根据其他列的计数添加列

python - scipy第一次启动慢

python - 在 pytorch 中为 CNN 设置自定义内核

Javascript不读取django模板中字典的键和值

pandas - 如果不是特定长度,则将 0 附加到数据帧字符串列

python - 将重复的列合并到同一数据框中

python - 在 Python 中将数据框列标题转换为行条目