gpt4 book ai didi

python - 根据另一个数据框在特定位置的数据框中插入多列

转载 作者:太空宇宙 更新时间:2023-11-04 01:50:35 25 4
gpt4 key购买 nike

我正面临这个问题,我有一个数据框,比方说 df1:

>>> df1 = pd.DataFrame(data = np.arange(45).reshape(-1,9), columns = ['A1','B1', 'C1', 
'A2', 'B2', 'C2','A3','B3','C3'])
>>> df1

A1 B1 C1 A2 B2 C2 A3 B3 C3
0 0 1 2 3 4 5 6 7 8
1 9 10 11 12 13 14 15 16 17
2 18 19 20 21 22 23 24 25 26
3 27 28 29 30 31 32 33 34 35
4 36 37 38 39 40 41 42 43 44

还有另一个数据框df2:

>>> df2 = pd.DataFrame(data = np.arange(15).reshape(-1,3), columns = ['AB1','AB2','AB3'])
>>> df2

AB1 AB2 AB3
0 0 1 2
1 3 4 5
2 6 7 8
3 9 10 11
4 12 13 14

现在我想要的是,将 df2 的列插入到 df1 的特定位置,这样 df1 就变成了(实际上一个新的 df 也可以):

>>> df1

A1 AB1 B1 C1 A2 AB2 B2 C2 A3 AB3 B3 C3
0 0 0 1 2 3 1 4 5 6 2 7 8
1 9 3 10 11 12 4 13 14 15 5 16 17
2 18 6 19 20 21 7 22 23 24 8 25 26
3 27 9 28 29 30 10 31 32 33 11 34 35
4 36 12 37 38 39 13 40 41 42 14 43 44

我现在通过创建一个新的空 df,然后遍历两个 df 的列,然后按顺序添加每一列来实现这一点。这是低效、丑陋的,并且违背了 DataFrames 的全部目的。所以我想知道是否已经有这种方法?我不确定这里是否已经回答了这样的问题,但我确定我没有找到任何结果。如果之前已经讨论过,如果有人指出我,我会很高兴。

最佳答案

您可以使用 concat然后用 sorted by multiple attributes 排序并通过子集的新值更改顺序 - []:

df = pd.concat([df1, df2], axis=1)
cols = sorted(df.columns, key = lambda x: (x[-1], x[:-1]))
print (cols)
['A1', 'AB1', 'B1', 'C1', 'A2', 'AB2', 'B2', 'C2', 'A3', 'AB3', 'B3', 'C3']

df = df[cols]
print (df)
A1 AB1 B1 C1 A2 AB2 B2 C2 A3 AB3 B3 C3
0 0 0 1 2 3 1 4 5 6 2 7 8
1 9 3 10 11 12 4 13 14 15 5 16 17
2 18 6 19 20 21 7 22 23 24 8 25 26
3 27 9 28 29 30 10 31 32 33 11 34 35
4 36 12 37 38 39 13 40 41 42 14 43 44

另一个想法是在列中创建 MultiIndex 并按第二级排序,最后通过 mapMultiIndex 展平:

df1.columns = [df1.columns.str[:1], df1.columns.str[1]]
df2.columns = [df2.columns.str[:2], df2.columns.str[2]]

df = pd.concat([df1, df2],axis=1).sort_index(axis=1, level=1)
df.columns = df.columns.map(''.join)
print (df)
A1 AB1 B1 C1 A2 AB2 B2 C2 A3 AB3 B3 C3
0 0 0 1 2 3 1 4 5 6 2 7 8
1 9 3 10 11 12 4 13 14 15 5 16 17
2 18 6 19 20 21 7 22 23 24 8 25 26
3 27 9 28 29 30 10 31 32 33 11 34 35
4 36 12 37 38 39 13 40 41 42 14 43 44

编辑:

对于更通用的解决方案,可以使用 DataFrame.reindexMultiIndex.from_product :

df1 = pd.DataFrame(data = np.arange(45).reshape(-1,9), 
columns = ['A1','B1', 'C1', 'A2', 'B2', 'C2','A3','B3','C3'])
df2 = pd.DataFrame(data = np.arange(15).reshape(-1,3), columns = ['Sum1','Sum2','Sum3'])


#change order of values in MultiIndex
df1.columns = [df1.columns.str[1], df1.columns.str[:1]]
df2.columns = [df2.columns.str[3], df2.columns.str[:3]]

mux = pd.MultiIndex.from_product([['1','2','3'], ['A','Sum','B','C']])
print (mux)
MultiIndex([('1', 'A'),
('1', 'Sum'),
('1', 'B'),
('1', 'C'),
('2', 'A'),
('2', 'Sum'),
('2', 'B'),
('2', 'C'),
('3', 'A'),
('3', 'Sum'),
('3', 'B'),
('3', 'C')],
)

df = pd.concat([df1, df2], axis=1).reindex(columns=mux)
df.columns = [f'{b}{a}' for a, b in df.columns]
print (df)
A1 Sum1 B1 C1 A2 Sum2 B2 C2 A3 Sum3 B3 C3
0 0 0 1 2 3 1 4 5 6 2 7 8
1 9 3 10 11 12 4 13 14 15 5 16 17
2 18 6 19 20 21 7 22 23 24 8 25 26
3 27 9 28 29 30 10 31 32 33 11 34 35
4 36 12 37 38 39 13 40 41 42 14 43 44

关于python - 根据另一个数据框在特定位置的数据框中插入多列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58129349/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com