python - 创建新的 DataFrame 作为其他 DataFrame 列的有序组合

标签 python pandas dataframe merge reshape

我有这种数据框

import pandas as pd

df1 = pd.DataFrame({'a':[1.1,1.1,1.1], 'b':[2.1,2.1,2.1], 'c':[3.1,3.1,3.1]})
df2 = pd.DataFrame({'aa':[1.2,1.2,1.2], 'bb':[2.2,2.2,2.2], 'cc':[3.2,3.2,3.2]})
df3 = pd.DataFrame({'aaa':[1.3,1.3,1.3], 'bbb':[2.3,2.3,2.3], 'ccc':[3.3,3.3,3.3]})

这些框架总是具有相同的形状(并且列名称并不总是符合字母顺序)。我想找出将它们的列组合到结果框架中的最佳方法,如下所示:

     a   aa  aaa    b   bb  bbb    c   cc  ccc
0  1.1  1.2  1.3  2.1  2.2  2.3  3.1  3.2  3.3
1  1.1  1.2  1.3  2.1  2.2  2.3  3.1  3.2  3.3
2  1.1  1.2  1.3  2.1  2.2  2.3  3.1  3.2  3.3

我的方法是嵌套循环并逐列填充新框架:

df_new = pd.DataFrame()

for i in range(df1.shape[1]):
    for df in [df1, df2, df3]:
        df_new[df.columns[i]] = df.iloc[:, i]

print(df_new)

它有效,但我认为有更可靠的方法来做到这一点。

编辑:在 pd.concat 的帮助下(感谢@Tbaki)它也可以通过两个步骤完成:

df_new = pd.concat([df1,df2,df3],axis=1)

small = df1.shape[1]
big = df_new.shape[1]

#create correct order
new_order = []

for i in range(small):
    new_order.extend(list(range(i, big, small)))

df_new.iloc[:, new_order]

谢谢!

最佳答案

IIUC:

In [17]: pd.concat([df1,df2,df3],axis=1) \
           .loc[:, np.concatenate([t for t in zip(df1.columns,df2.columns,df3.columns)])]
Out[17]:
     a   aa  aaa    b   bb  bbb    c   cc  ccc
0  1.1  1.2  1.3  2.1  2.2  2.3  3.1  3.2  3.3
1  1.1  1.2  1.3  2.1  2.2  2.3  3.1  3.2  3.3
2  1.1  1.2  1.3  2.1  2.2  2.3  3.1  3.2  3.3

关于python - 创建新的 DataFrame 作为其他 DataFrame 列的有序组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44799299/

相关文章:

python - 基于 http Web 服务的简单 XML

python - 基于 numpy/scipy 包的代码中的形状不一致

python列表+空numpy数组=空numpy数组?

python - 通过多个条件选择行的懒惰方式

python - 发现 numpy 多年来百分比变化减少

python - 通过网状结构在 R 中创建 python 列表

python - 与整数差距的季度数

python - 如何将数据框中的不同数据组绘制成一个图形

pandas - 如何将计数从一组范围转移(总结)到包含这些范围的范围?

python - 将 pandas 数据框元素转换为元组