连接多个pandas DataFrames

问题描述 投票:1回答:1

我有大量具有类似前缀df_的DataFrame,看起来像:

df_1
df_x
df_ab
.
.
.
df_1a
df_2b

当然,我可以做final_df = pd.concat([df_1, df_x, df_ab, ... df_1a, df_2b], axis = 1)

问题是虽然前缀df_将始终存在,但其余的数据帧名称不断变化,并且没有任何模式。因此,我必须不断更新pd.concat中的数据帧列表以创建'final_df`,这很麻烦。

问题:无论如何要告诉python连接命名空间中的所有已定义的数据帧(仅)从df_开始并创建final_df或至少返回所有这些数据帧的列表,然后我可以手动输入pd.concat

python pandas dataframe
1个回答
1
投票

你可以使用内置函数globals()做这样的事情:

def concat_all(prefix='df_'):
    dfs = [df for name, df in globals().items() if name.startswith(prefix)
           and isinstance(df, pd.DataFrame)]
    return pd.concat(dfs, axis=1)

逻辑:

  1. 将全局命名空间过滤到以prefix开头的DataFrame
  2. 把它们放在一个列表中(concat不带发电机)
  3. 在第一轴上调用concat()

例:

import pandas as pd

df_1 = pd.DataFrame([[0, 1], [2, 3]])
df_2 = pd.DataFrame([[4, 5], [6, 7]])
other_df = df_1.copy() * 2  # ignore this
s_1 = pd.Series([1, 2, 3, 4])  # and this

final_df = concat_all()
final_df

   0  1  0  1
0  0  1  4  5
1  2  3  6  7

始终谨慎使用globals()。它会为您提供整个模块命名空间的字典。

你需要globals()而不是locals(),因为字典正在函数中使用。 locals()在使用时将无效。

© www.soinside.com 2019 - 2024. All rights reserved.