Python Pandas dataframe取消堆叠数据并创建新列
我有两组堆叠数据,如下所示:Python Pandas dataframe取消堆叠数据并创建新列,python,pandas,dataframe,group-by,Python,Pandas,Dataframe,Group By,我有两组堆叠数据,如下所示: set n value_1 value_2 0 1 1024 25942.6 25807.8 ----> first set starts here 1 1 2048 72000.5 71507.9 2 1 4096 161095.0 160303.0 3 1 8192 35641
set n value_1 value_2
0 1 1024 25942.6 25807.8 ----> first set starts here
1 1 2048 72000.5 71507.9
2 1 4096 161095.0 160303.0
3 1 8192 356419.0 354928.0
4 1 16384 793562.0 788666.0
5 1 32768 1914250.0 1889850.0
6 1 65536 3490860.0 3479040.0
7 1 131072 8096130.0 8036290.0
8 1 262144 16616500.0 16525400.0
11 2 1024 35116.3 35032.5 ----> second set starts here
12 2 2048 98783.8 98507.0
13 2 4096 230813.0 230206.0
14 2 8192 521754.0 518052.0
15 2 16384 1046870.0 1040990.0
16 2 32768 2118340.0 2112680.0
17 2 65536 4693000.0 4673130.0
18 2 131072 9960240.0 9892870.0
19 2 262144 21230600.0 21068700.0
我如何才能取消堆叠它们,以便获得两个新列value\u 1\u 2
,和value\u 2\u 2
,它们对应于第二组数据,并基于n
的值与第一组数据匹配
这就是我想要的:
n value_1 value_2 value_1_2 value_2_2
1024 25942.6 25807.8 35116.3 35032.5
2048 72000.5 71507.9 98783.8 98507
4096 161095 160303 230813 230206
8192 356419 354928 521754 518052
16384 793562 788666 1046870 1040990
32768 1914250 1889850 2118340 2112680
65536 3490860 3479040 4693000 4673130
131072 8096130 8036290 9960240 9892870
262144 16616500 16525400 21230600 21068700
有一种大锤式的方法。首先
foo = df.groupby('n')
这是成对的列表(n,组)
。对于每一组,你都需要
newgroup = pd.concat([group.iloc[0], group.iloc[1]], axis=1)
(您可以更改concat中的列名)
最后,
pd.concat
垂直添加新组。首先,我们创建一个dfs
列表,方法是使用对列Set
上的数据帧进行分组,然后针对数据帧中的每个组,我们使用组标识符向每个列添加组标识符:
最后,通过对列n
上的连续数据帧应用操作,我们使用将数据帧列表dfs
缩减为单个未堆叠的数据帧
from functools import reduce
dfs = [
g.drop('set', 1).add_suffix(f'_{k}').rename({f'n_{k}': 'n'}, axis=1)
for k, g in df.groupby('set')
]
df1 = reduce(lambda x, y: pd.merge(x, y, on='n'), dfs)
结果:
# print(df1)
n value_1_1 value_2_1 value_1_2 value_2_2
0 1024 25942.6 25807.8 35116.3 35032.5
1 2048 72000.5 71507.9 98783.8 98507.0
2 4096 161095.0 160303.0 230813.0 230206.0
3 8192 356419.0 354928.0 521754.0 518052.0
4 16384 793562.0 788666.0 1046870.0 1040990.0
5 32768 1914250.0 1889850.0 2118340.0 2112680.0
6 65536 3490860.0 3479040.0 4693000.0 4673130.0
7 131072 8096130.0 8036290.0 9960240.0 9892870.0
8 262144 16616500.0 16525400.0 21230600.0 21068700.0
您想要
n\u copy
列的任何具体原因,因为它似乎与n
完全相同?不,我可以去掉它。我不明白您所说的成对(n,组)和foo的列表是什么意思。你介意把所有的结果都展示给我吗,就像Shubham Sharma的答案一样