DataFrame 合并未交叉的块

dataframe merge un-crossed blocks

提问人:user6703592 提问时间:11/17/2023 最后编辑:toyota Suprauser6703592 更新时间:11/18/2023 访问量:37

问:

我想合并一些未交叉的块。例如

import pandas as pd

df = pd.DataFrame()
df_11 = pd.DataFrame([[1,1], [1,1]], index=['1', '2'], columns=['col1', 'col2'])
df_12 = pd.DataFrame([[2,2], [2,2]], index=['1', '2'], columns=['col3', 'col4'])
df_21 = pd.DataFrame([[3,3], [3,3]], index=['3', '4'], columns=['col1', 'col2'])
df_22 = pd.DataFrame([[4,4], [4,4]], index=['3', '4'], columns=['col3', 'col4'])

预期结果是

   'col1', 'col2', 'col3', 'col4'

'1' 1,1,2,2

'2' 1,1,2,2

'3' 3,3,4,4

'4' 3,3,4,4

我尝试使用:join

for ele in [df_11, df_12, df_21, df_22]:
    df = df.join(ele, how='outer')

但是它创建的元素将与后面的块(lsuffix 和 rsuffix)重叠。Nan

一种幼稚的方法只是收集所有列和索引并设置为 ,这似乎不是一个好方法。df

Python Pandas 数据帧

评论

0赞 mozway 11/17/2023
您是否事先知道df_11/df_21在彼此的“顶部”,并紧挨着其他两个?或者您正在寻找一个完全程序化的解决方案?

答:

0赞 Konstantinos K. 11/17/2023 #1

这能解决您的问题吗:)?

import pandas as pd

df_11 = pd.DataFrame([[1, 1], [1, 1]], index=['1', '2'], columns=['col1', 'col2'])
df_12 = pd.DataFrame([[2, 2], [2, 2]], index=['1', '2'], columns=['col3', 'col4'])
df_21 = pd.DataFrame([[3, 3], [3, 3]], index=['3', '4'], columns=['col1', 'col2'])
df_22 = pd.DataFrame([[4, 4], [4, 4]], index=['3', '4'], columns=['col3', 'col4'])

dfs = [df_11, df_12, df_21, df_22]

# Merge dataframes along the columns axis (axis=1)
df = pd.concat(dfs, axis=1)

# Sort the columns for better readability (optional)
df = df.reindex(sorted(df.columns), axis=1)

print(df)

评论

0赞 user6703592 11/17/2023
代码不起作用
2赞 mozway 11/17/2023 #2

如果您已经知道如何排列 DataFrame,请使用几个 concat

out = pd.concat([pd.concat([df_11, df_21]),
                 pd.concat([df_12, df_22])], axis=1)

如果需要编程方法,可以使用字典对每个常见列的数据帧进行分组,垂直分组,水平对所有输出进行分组:concatconcat

dfs = [df_11, df_12, df_21, df_22]

d = {}
for df in dfs:
    d.setdefault(tuple(df), []).append(df)

out = pd.concat([pd.concat(l) for l in d.values()], axis=1)

或者全部堆叠,连接取消堆叠

dfs = [df_11, df_12, df_21, df_22]

out = pd.concat([df.stack() for df in dfs]).unstack()

请注意,不应有重叠。

输出:

   col1  col2  col3  col4
1     1     1     2     2
2     1     1     2     2
3     3     3     4     4
4     3     3     4     4
1赞 sammywemmy 11/18/2023 #3

您可以使用它来生成新的数据帧,但您必须测试它的性能,因为下面的解决方案本质上是将数据转换为列表:defaultdict

from collections import defaultdict
dfs = [df_11,df_12,df_21,df_22]
container = defaultdict(list)
for df in dfs:
    for name, value in df.items():
        container[name].extend(value)

print(container)
defaultdict(list,
            {'col1': [1, 1, 3, 3],
             'col2': [1, 1, 3, 3],
             'col3': [2, 2, 4, 4],
             'col4': [2, 2, 4, 4]}

pd.DataFrame(container)
   col1  col2  col3  col4
0     1     1     2     2
1     1     1     2     2
2     3     3     4     4
3     3     3     4     4