python - Pandas :合并多个数据框并控制列名?

标签 python pandas

我想将九个 Pandas 数据框合并成一个数据框,对两列进行连接,控制列名。这可能吗?

我有九个数据集。它们都有以下列:

org, name, items,spend

我想将它们加入到一个具有以下列的数据框中:

org, name, items_df1, spend_df1, items_df2, spend_df2, items_df3...

我一直在阅读有关 merging and joining 的文档.我目前可以像这样将两个数据集合并在一起:

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 定义合并函数:

merge = functools.partial(pd.merge, on=['org', 'name'])

由于在 functools.partial 中指定 suffixes 参数只允许 一个固定的后缀选择,因为在这里我们需要为每个后缀选择一个不同的后缀 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  

关于python - Pandas :合并多个数据框并控制列名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34338831/

相关文章:

Python/Pandas -- 将日期和小时列转换为小时索引

python - 读取许多文件并在 Pandas 中创建列

python - 如何编写一个python函数,当输入是列表时返回列表,当输入是非列表时返回非列表值?

python - 关闭列表理解中的文件句柄

python - 计算列表列表中 2 个变量同时出现的次数

python - 合并行 pandas 数据框

python - 如何连接 Pandas 数据框列

python - 4 人锦标赛安排,Python

python - 删除列表中第一项的函数 (Python)

python - 使用 'how=count' 重新采样导致问题