提问人:user6703592 提问时间:11/17/2023 最后编辑:toyota Suprauser6703592 更新时间:11/18/2023 访问量:37
DataFrame 合并未交叉的块
dataframe merge un-crossed blocks
问:
我想合并一些未交叉的块。例如
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
答:
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)
如果需要编程方法,可以使用字典对每个常见列的数据帧进行分组,垂直分组,水平对所有输出进行分组:concat
concat
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
评论