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