在pandas中连接文件

在pandas中连接文件,pandas,Pandas,我来自Excel的背景,但我喜欢熊猫,它确实让我更有效率。不幸的是,我可能从Excel中继承了一些坏习惯。我有三个大文件(每个文件的行数在200万到1300万之间),其中包含可以绑定在一起的交互数据,不幸的是,没有唯一的键连接这些文件。我将(Excel公式)3个字段连接到所有三个文件的一个新列中 我组合在一起的每个文件上都有三列(其他字段类似于一个文件上的交互原因、另一个文件上的分数以及第三个文件上的其他数据,我希望将这些数据绑定到某个agentID): 我编辑我的日期格式,使其在每个文件上保持

我来自Excel的背景,但我喜欢熊猫,它确实让我更有效率。不幸的是,我可能从Excel中继承了一些坏习惯。我有三个大文件(每个文件的行数在200万到1300万之间),其中包含可以绑定在一起的交互数据,不幸的是,没有唯一的键连接这些文件。我将(Excel公式)3个字段连接到所有三个文件的一个新列中

我组合在一起的每个文件上都有三列(其他字段类似于一个文件上的交互原因、另一个文件上的分数以及第三个文件上的其他数据,我希望将这些数据绑定到某个agentID):

我编辑我的日期格式,使其在每个文件上保持一致:

df[Date] = pd.to_datetime(df['Date'], coerce = True)
df[Date] =  df[Date].apply(lambda x:x.date().strftime('%Y-%m-%d'))
然后我创建了一个独特的列(好吧,尽我所能的独特。有时同一个客户在同一天与同一个代理进行交互,但这应该是非常罕见的):

我对df2执行相同的步骤,然后:

combined = pd.merge(df, df2, how = 'left', on = 'Unique')
我通常会将它发送到一个新的csv,以防崩溃,gzip它,然后再次读取它,并对第三个文件再次执行相同的过程

 final = pd.merge(combined, df2, how = 'left', on = 'Unique')

正如你所看到的,这需要时间。我必须格式化每个文件上的日期,然后将它们转换为文本,创建一个添加到文件大小的对象列,并且(由于原始数据本身的问题)删除重复项,这样我就不会意外地夸大数字。是否有更有效的工作流程供我遵循?

而不是使用
on='Unique'

combined = pd.merge(df, df2, how = 'left', on = 'Unique')
您可以将列列表传递给
on
关键字参数:

combined = pd.merge(df, df2, how='left', on=['Date', 'CustomerID', 'AgentID'])
Pandas将根据
'Date'、'CustomerID'、'AgentID'
列中的三组值正确合并行。这比构建独特的柱更安全(见下文),也更容易


比如说,

import pandas as pd
import numpy as np
np.random.seed(2015)

df = pd.DataFrame({'Date': pd.to_datetime(['2000-1-1','2000-1-1','2000-1-2']),
                   'CustomerID':[1,1,2],
                   'AgentID':[10,10,11]})

df2 = df.copy()
df3 = df.copy()
L = len(df)
df['ABC'] = np.random.choice(list('ABC'), L)
df2['DEF'] = np.random.choice(list('DEF'), L)
df3['GHI'] = np.random.choice(list('GHI'), L)
df2 = df2.iloc[[0,2]]

combined = df
for x in [df2, df3]:
    combined = pd.merge(combined, x, how='left', on=['Date','CustomerID', 'AgentID'])
屈服

In [200]: combined
Out[200]: 
   AgentID  CustomerID      Date ABC DEF GHI
0       10           1  2000-1-1   C   F   H
1       10           1  2000-1-1   C   F   G
2       10           1  2000-1-1   A   F   H
3       10           1  2000-1-1   A   F   G
4       11           2  2000-1-2   A   F   I

注意事项:

将CustomerID添加到AgentID以创建唯一ID可能会有问题 --尤其是当两者都没有固定宽度格式时

例如,如果
CustomerID='12'
AgentID='34'
,则(忽略不会导致问题的日期,因为它具有固定的宽度)
唯一的
'1234'
。但是如果
CustomerID='1'
AgentID='234'
那么
Unique
将 再次等于
'1234'
。因此,
Unique
id可能完全不同 客户/代理配对


另外,将日期字符串解析为类似日期的对象是一个好主意

df['Date'] = pd.to_datetime(df['Date'], coerce=True)
请注意,如果您使用

combined = pd.merge(combined, x, how='left', on=['Date','CustomerID', 'AgentID'])

无需将任何列转换回字符串。

而不是使用
on='Unique'

combined = pd.merge(df, df2, how = 'left', on = 'Unique')
您可以将列列表传递给
on
关键字参数:

combined = pd.merge(df, df2, how='left', on=['Date', 'CustomerID', 'AgentID'])
Pandas将根据
'Date'、'CustomerID'、'AgentID'
列中的三组值正确合并行。这比构建独特的柱更安全(见下文),也更容易


比如说,

import pandas as pd
import numpy as np
np.random.seed(2015)

df = pd.DataFrame({'Date': pd.to_datetime(['2000-1-1','2000-1-1','2000-1-2']),
                   'CustomerID':[1,1,2],
                   'AgentID':[10,10,11]})

df2 = df.copy()
df3 = df.copy()
L = len(df)
df['ABC'] = np.random.choice(list('ABC'), L)
df2['DEF'] = np.random.choice(list('DEF'), L)
df3['GHI'] = np.random.choice(list('GHI'), L)
df2 = df2.iloc[[0,2]]

combined = df
for x in [df2, df3]:
    combined = pd.merge(combined, x, how='left', on=['Date','CustomerID', 'AgentID'])
屈服

In [200]: combined
Out[200]: 
   AgentID  CustomerID      Date ABC DEF GHI
0       10           1  2000-1-1   C   F   H
1       10           1  2000-1-1   C   F   G
2       10           1  2000-1-1   A   F   H
3       10           1  2000-1-1   A   F   G
4       11           2  2000-1-2   A   F   I

注意事项:

将CustomerID添加到AgentID以创建唯一ID可能会有问题 --尤其是当两者都没有固定宽度格式时

例如,如果
CustomerID='12'
AgentID='34'
,则(忽略不会导致问题的日期,因为它具有固定的宽度)
唯一的
'1234'
。但是如果
CustomerID='1'
AgentID='234'
那么
Unique
将 再次等于
'1234'
。因此,
Unique
id可能完全不同 客户/代理配对


另外,将日期字符串解析为类似日期的对象是一个好主意

df['Date'] = pd.to_datetime(df['Date'], coerce=True)
请注意,如果您使用

combined = pd.merge(combined, x, how='left', on=['Date','CustomerID', 'AgentID'])

无需将任何列转换回字符串。

而不是使用
on='Unique'

combined = pd.merge(df, df2, how = 'left', on = 'Unique')
您可以将列列表传递给
on
关键字参数:

combined = pd.merge(df, df2, how='left', on=['Date', 'CustomerID', 'AgentID'])
Pandas将根据
'Date'、'CustomerID'、'AgentID'
列中的三组值正确合并行。这比构建独特的柱更安全(见下文),也更容易


比如说,

import pandas as pd
import numpy as np
np.random.seed(2015)

df = pd.DataFrame({'Date': pd.to_datetime(['2000-1-1','2000-1-1','2000-1-2']),
                   'CustomerID':[1,1,2],
                   'AgentID':[10,10,11]})

df2 = df.copy()
df3 = df.copy()
L = len(df)
df['ABC'] = np.random.choice(list('ABC'), L)
df2['DEF'] = np.random.choice(list('DEF'), L)
df3['GHI'] = np.random.choice(list('GHI'), L)
df2 = df2.iloc[[0,2]]

combined = df
for x in [df2, df3]:
    combined = pd.merge(combined, x, how='left', on=['Date','CustomerID', 'AgentID'])
屈服

In [200]: combined
Out[200]: 
   AgentID  CustomerID      Date ABC DEF GHI
0       10           1  2000-1-1   C   F   H
1       10           1  2000-1-1   C   F   G
2       10           1  2000-1-1   A   F   H
3       10           1  2000-1-1   A   F   G
4       11           2  2000-1-2   A   F   I

注意事项:

将CustomerID添加到AgentID以创建唯一ID可能会有问题 --尤其是当两者都没有固定宽度格式时

例如,如果
CustomerID='12'
AgentID='34'
,则(忽略不会导致问题的日期,因为它具有固定的宽度)
唯一的
'1234'
。但是如果
CustomerID='1'
AgentID='234'
那么
Unique
将 再次等于
'1234'
。因此,
Unique
id可能完全不同 客户/代理配对


另外,将日期字符串解析为类似日期的对象是一个好主意

df['Date'] = pd.to_datetime(df['Date'], coerce=True)
请注意,如果您使用

combined = pd.merge(combined, x, how='left', on=['Date','CustomerID', 'AgentID'])

无需将任何列转换回字符串。

而不是使用
on='Unique'

combined = pd.merge(df, df2, how = 'left', on = 'Unique')
您可以将列列表传递给
on
关键字参数:

combined = pd.merge(df, df2, how='left', on=['Date', 'CustomerID', 'AgentID'])
Pandas将根据
'Date'、'CustomerID'、'AgentID'
列中的三组值正确合并行。这比构建独特的柱更安全(见下文),也更容易


比如说,

import pandas as pd
import numpy as np
np.random.seed(2015)

df = pd.DataFrame({'Date': pd.to_datetime(['2000-1-1','2000-1-1','2000-1-2']),
                   'CustomerID':[1,1,2],
                   'AgentID':[10,10,11]})

df2 = df.copy()
df3 = df.copy()
L = len(df)
df['ABC'] = np.random.choice(list('ABC'), L)
df2['DEF'] = np.random.choice(list('DEF'), L)
df3['GHI'] = np.random.choice(list('GHI'), L)
df2 = df2.iloc[[0,2]]

combined = df
for x in [df2, df3]:
    combined = pd.merge(combined, x, how='left', on=['Date','CustomerID', 'AgentID'])
屈服

In [200]: combined
Out[200]: 
   AgentID  CustomerID      Date ABC DEF GHI
0       10           1  2000-1-1   C   F   H
1       10           1  2000-1-1   C   F   G
2       10           1  2000-1-1   A   F   H
3       10           1  2000-1-1   A   F   G
4       11           2  2000-1-2   A   F   I

注意事项:

将CustomerID添加到AgentID以创建唯一ID可能会有问题 --尤其是当两者都没有固定宽度格式时

例如,如果
CustomerID='12'
AgentID='34'
,则(忽略不会导致问题的日期,因为它具有固定的宽度)
唯一的
'1234'
。但是如果
CustomerID='1'
AgentID='234'
那么
Unique
将 再次等于
'1234'
。因此,
Unique
id可能完全不同 客户/代理配对


附言:是的