在某些条件下更快地复制 pandas 数据

Posted

技术标签:

【中文标题】在某些条件下更快地复制 pandas 数据【英文标题】:Faster copying of pandas data with some conditions 【发布时间】:2019-08-26 22:05:30 【问题描述】:

我有一个数据框(df_main),我想根据从另一个数据框(df_data)中找到必要的列来将数据复制到其中。

df_data
   name  Index     par_1   par_2 ... par_n
0    A1      1        a0      b0
1    A1      2        a1
2    A1      3        a2
3    A1      4        a3 
4    A2      2        a4
...    

df_main
   name Index_0  Index_1    
0    A1       1        2
1    A1       1        3
2    A1       1        4
3    A1       2        3 
4    A1       2        4
5    A1       3        4
...

我想将 df_data 中的参数列复制到 df_main 中,条件是 df_data 行中具有相同名称和索引的所有参数都复制到 df_main。 我使用 for 循环进行了以下实现,这实际上太慢而无法使用:

def data_copy(df, df_data, indice):
    '''indice: whether Index_0 or Index_1 is being checked'''
    names = df['name'].unique()
    # We get all different names in the dataset to loop over
    for name in tqdm.tqdm(names):
        # Get unique index for a specific name
        indexes = df[df['name']== name][indice].unique()
        # Looping over all indexes
        for index in indexes:
            # From df_data, get the data of all cols of specific name and data
            data = df_data[(df_data['Index']==index) & (df_data['name'] == name)]

            # columns: Only the cols of structure's data
            req_data = data[columns]

            for col in columns:
                # For each col (e.g. g1, g2, etc), get the val of a specific index
                val = df_struc.loc[(df_data['Index']==index) & (df_data['name'] == name), col]
                df.loc[(df[indice] == index) & (df['name']== name), col] = val[val.index.item()]
    return df

df_main = data_copy(df_main, df_data, 'Index_0') 

这给了我我所需要的:

df_main
   name Index_0  Index_1   par_1    par_2 ...
0    A1       1        2      a0
1    A1       1        3      a0    
2    A1       1        4      a0
3    A1       2        3      a1
4    A1       2        4      a1
5    A1       3        4      a2

但是,在非常大的数据上运行它需要大量时间。避免 for 循环以加快实现速度的最佳方法是什么?

【问题讨论】:

对我来说看起来像是数据合并。 df_main.merge(df_data, left_on = ['name', 'Index_0'], right_on=['name','Index']) @MarkWang 合并功能实际上是我正在寻找的。我的 for 循环实现对于扩展是不切实际的。 【参考方案1】:

对于每个数据框,您可以创建一个新列来连接名称和索引。见下文:

import pandas as pd

df1 = 'name':['A1','A1'],'index':['1','2'],'par_1':['a0','a1']
df1 = pd.DataFrame(data=df1)
df1['new'] = df1['name'] + df1['index'] 
df1

df2 = 'name':['A1','A1'],'index_0':['1','2'],'index_1':['2','3']
df2 = pd.DataFrame(data=df2)
df2['new'] = df2['name'] + df2['index_0'] 
df2

for i, row in df1.iterrows():
    df2.loc[(df2['new'] == row['new']) , 'par_1'] = row['par_1']
df2 

结果:

    name index_0 index_1 new    par_1
0   A1   1       2       A11    a0
1   A1   2       3       A12    a1

【讨论】:

以上是关于在某些条件下更快地复制 pandas 数据的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Pandas 的条件删除数据框中的某些行? [复制]

Pandas:如何更快地应用数据框?

Pandas:如何更快地应用数据框?

python pandas - 生成具有多个条件的视图/复制警告过滤数据框

从两个 Pandas DataFrames 向数据帧添加一列,当前使用两个带有条件的循环:有更快的方法吗?

在另一列上复制在某些条件下具有空值的列