繁体   English   中英

有效地根据条件为 Pandas 数据框创建新行

[英]Create new rows to pandas dataframe based on condition efficiently

我有两个 Pandas 数据框:一个带有 ID 和值,另一个将 ID 与其他 ID 映射。 目标是创建一个基于 df1 的新数据框。 它循环遍历 df1 中的每个 sourceId 并查找 df2(一个映射 df)以查找 sourceId 中的匹配项。 如果找到匹配项,则会创建一个新行,其值与 df1 中的值相同。 因此,如果找到多个匹配项,则循环会创建多行(例如,ID 为 A 和 C)。 如果只找到一个匹配项(例如,id B),则只创建一行。

下面的代码正是我想要的,但它的执行速度非常慢。 在我的原始数据集中,df1 是 440K 行,df2 有数千个不同 ID 的映射——目前代码以 10-25 it/s 的速度运行,这太多了。

有没有更快的方法可以从矩阵计算/numpy/pandas的其他好处中受益?

import pandas as pd
df1 = pd.DataFrame({
    'SourceId': ['A', 'B', 'C', 'A', 'C', 'B'], 
    'value': [1, 5, 12, 30, 32, 55], 
    'time': [pd.to_datetime('2020-04-04 08:49:52.166498900+0000'),
             pd.to_datetime('2020-08-14 06:12:40.860460500+0000'),
             pd.to_datetime('2020-05-13 09:20:50.052688900+0000'),
             pd.to_datetime('2020-03-09 13:55:17.335340600+0000'),
             pd.to_datetime('2020-08-14 09:30:56.359635400+0000'),
             pd.to_datetime('2020-01-31 23:03:46.539892900+0000')],
    'otherInfo': ['0A10a', '055jA', 'boAqz', '0t,m5A', '09tjq1', 'akk_1!']})
df2 = pd.DataFrame({'SourceId': ['A', 'A', 'B', 'C', 'C', 'C'], 'TargetId': ['A', 'Q', 'B', 'C', 'B', 'X'], 'trueIfMatch': [1, 0, 1, 1, 0, 0]})

df3 = pd.DataFrame()
for r in df1.itertuples():
    SourceId = r.SourceId
    value = r.value
    time = r.time
    otherInfo = r.otherInfo
    if SourceId in df2.SourceId.unique():
        entries = df2.loc[df2.SourceId == SourceId].TargetId.tolist()
        for entry in entries:
            df3 = df3.append({
                'sourceId': SourceId,
                'targetId': entry,
                'value': value,
                'time': time,
                'otherInfo': otherInfo
            }, ignore_index=True)
display(df3)

在此处输入图片说明 在此处输入图片说明 在此处输入图片说明

df.mergesort_values df.merge使用:

In [2293]: df3 = df1.merge(df2, on='SourceId').sort_values('value')

In [2294]: df3
Out[2294]: 
   SourceId  value TargetId
0         A      1        A
1         A      1        Q
4         B      5        B
6         C     12        C
7         C     12        B
8         C     12        X
2         A     30        A
3         A     30        Q
9         C     32        C
10        C     32        B
11        C     32        X
5         B     55        B

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM