【问题标题】:pandas compare and put datas using two dataframepandas 使用两个数据框比较和放置数据
【发布时间】:2016-03-10 07:52:15
【问题描述】:

我在 python pandas 中有两个这样的数据框:

df1 是原始数据集

df2是df1的列信息

import pandas as pd

df1 = pd.DataFrame()
data_list = ['AA1','AAABB','AACCCDDDD', 'AACCCDDDDEEEEE','AA111','AA11222']
df1['DATA'] = data_list

df1 是原始数据的数据集,如下所示:

df1
-------------------
    DATA
-------------------
0   AA1
1   AAABB
2   AACCCDDDD
3   AACCCDDDDEEEEE
4   AA111
5   AA11222

df2 代码:

df2 = pd.DataFrame()
data_list = ['AA1','AAAB','AACCC']
info_list = ['TYPE1','TYPE2','TYPE3']
size_list = [3, 4, 5]
df2['DATA_CLASS'] = data_list
df2['DATA_INFO']  = info_list
df2['DATA_SIZE']  = size_list

df2有df1的'DATA'的列信息

df2 像这样:

df2
-----------------------------
    DATA_CLASS  DATA_INFO   DATA_SIZE
0   AA1         TYPE1        3
1   AAAB        TYPE2        4
2   AACCC       TYPE3        5

我想使用 df2 ['DATA_CLASS','DATA_SIZE'] 将 'DATA_INFO' 放入 df1。

所以我是这样写的:

df1['DATA_INFO'] = ''
for idx, row in df2.iterrows():
    size = row['DATA_SIZE']

    df1.loc[df1.DATA.str[:size] == row['DATA_CLASS'], 'DATA_INFO'] =  row['DATA_INFO']    

因此 df1 有新列“DATA_INFO”:

    DATA              DATA_INFO
----------------------------------
0   AA1               TYPE1
1   AAABB             TYPE2
2   AACCCDDDD         TYPE3
3   AACCCDDDDEEEEE    TYPE3
4   AA111             TYPE1
5   AA11222           TYPE1

但我在使用 dataframe .loc 函数时遇到了问题。

如果 df1 的行数超过 100,000 而 df2 的行数超过 10,000,则需要很长时间来处理

我认为 dataframe 的 iterrows() 是延迟的主要原因

有没有人知道如何解决将数据类型放入 df1 不使用 .loc 函数?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    我认为您可以首先通过unique 列DATA_SIZE 的所有可能的子字符串创建df1 的新列,然后使用drop_duplicates 创建stack df1 和merge。如果订购很重要,请使用reindex:

    for i in df2['DATA_SIZE'].unique():
        #print i
        df1.loc[:, i] = df1['DATA'].str[:i]
    print df1
                 DATA    3     4      5
    0             AA1  AA1   AA1    AA1
    1           AAABB  AAA  AAAB  AAABB
    2       AACCCDDDD  AAC  AACC  AACCC
    3  AACCCDDDDEEEEE  AAC  AACC  AACCC
    4           AA111  AA1  AA11  AA111
    5         AA11222  AA1  AA11  AA112
    
    df3 = df1.set_index('DATA').stack().reset_index(level=1,drop=True).reset_index(name='MATCH')
    print df3
                  DATA  MATCH
    0              AA1    AA1
    1              AA1    AA1
    2              AA1    AA1
    3            AAABB    AAA
    4            AAABB   AAAB
    5            AAABB  AAABB
    6        AACCCDDDD    AAC
    7        AACCCDDDD   AACC
    8        AACCCDDDD  AACCC
    9   AACCCDDDDEEEEE    AAC
    10  AACCCDDDDEEEEE   AACC
    11  AACCCDDDDEEEEE  AACCC
    12           AA111    AA1
    13           AA111   AA11
    14           AA111  AA111
    15         AA11222    AA1
    16         AA11222   AA11
    17         AA11222  AA112
    
    df = pd.merge(df3, df2, left_on="MATCH", right_on="DATA_CLASS").drop_duplicates()
    df = df[['DATA','DATA_INFO']]
    print df
                 DATA DATA_INFO
    0             AA1     TYPE1
    3           AA111     TYPE1
    4         AA11222     TYPE1
    5           AAABB     TYPE2
    6       AACCCDDDD     TYPE3
    7  AACCCDDDDEEEEE     TYPE3
    
    
    #if order of column DATA is important    
    print df.set_index('DATA').reindex(df1.set_index('DATA').index).reset_index()
                 DATA DATA_INFO
    0             AA1     TYPE1
    1           AAABB     TYPE2
    2       AACCCDDDD     TYPE3
    3  AACCCDDDDEEEEE     TYPE3
    4           AA111     TYPE1
    5         AA11222     TYPE1
    

    【讨论】:

    • 谢谢!在我的情况下,你是最好的。使用您的解决方案连接两个数据框非常快。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-14
    • 1970-01-01
    • 1970-01-01
    • 2018-10-10
    相关资源
    最近更新 更多