我想将九个Pandas数据帧合并到一个数据帧中,在两列上进行连接,控制列名.这可能吗?
我有九个数据集.所有这些都有以下列:
org, name, items,spend
我想将它们加入到包含以下列的单个数据框中:
org, name, items_df1, spend_df1, items_df2, spend_df2, items_df3...
我一直在阅读有关合并和加入的文档.我现在可以合并两个数据集,如下所示:
ad = pd.DataFrame.merge(df_presents, df_trees, on=['practice', 'name'], suffixes=['_presents', '_trees'])
这很好用,print list(aggregate_data.columns.values)
给我看了以下几列:
[org', u'name', u'spend_presents', u'items_presents', u'spend_trees', u'items_trees'...]
但是我如何为九列做到这一点?merge
似乎每次只接受两个,如果我按顺序执行,我的列名最终会变得非常混乱.
您可以使用functools.reduce
迭代方式应用于pd.merge
每个DataFrame:
result = functools.reduce(merge, dfs)
这相当于
result = dfs[0] for df in dfs[1:]: result = merge(result, df)
要传递on=['org', 'name']
参数,可以使用functools.partial
define merge函数:
merge = functools.partial(pd.merge, on=['org', 'name'])
由于指定suffixes
参数functools.partial
只允许一个固定的后缀选择,并且因为这里我们需要为每个pd.merge
调用使用不同的后缀
,我认为在调用之前准备DataFrames列名称是最容易的pd.merge
:
for i, df in enumerate(dfs, start=1): df.rename(columns={col:'{}_df{}'.format(col, i) for col in ('items', 'spend')}, inplace=True)
例如,
import pandas as pd import numpy as np import functools np.random.seed(2015) N = 50 dfs = [pd.DataFrame(np.random.randint(5, size=(N,4)), columns=['org', 'name', 'items', 'spend']) for i in range(9)] for i, df in enumerate(dfs, start=1): df.rename(columns={col:'{}_df{}'.format(col, i) for col in ('items', 'spend')}, inplace=True) merge = functools.partial(pd.merge, on=['org', 'name']) result = functools.reduce(merge, dfs) print(result.head())
产量
org name items_df1 spend_df1 items_df2 spend_df2 items_df3 \ 0 2 4 4 2 3 0 1 1 2 4 4 2 3 0 1 2 2 4 4 2 3 0 1 3 2 4 4 2 3 0 1 4 2 4 4 2 3 0 1 spend_df3 items_df4 spend_df4 items_df5 spend_df5 items_df6 \ 0 3 1 0 1 0 4 1 3 1 0 1 0 4 2 3 1 0 1 0 4 3 3 1 0 1 0 4 4 3 1 0 1 0 4 spend_df6 items_df7 spend_df7 items_df8 spend_df8 items_df9 spend_df9 0 3 4 1 3 0 1 2 1 3 4 1 3 0 0 3 2 3 4 1 3 0 0 0 3 3 3 1 3 0 1 2 4 3 3 1 3 0 0 3