我有两组堆叠的数据,如下所示:
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_1_2
和value_2_2
,它们分别对应于第二组数据并根据{{1 }}?
这就是我想要的:
n
答案 0 :(得分:2)
首先,我们通过使用DataFrame.groupby
将数据帧分组到列dfs
上来创建Set
的列表,然后对于数据帧中的每个组,我们使用DataFrame.add_suffix
添加每个列的组标识符:
最后,我们通过对列上的连续数据帧应用functools.reduce
操作,使用pd.merge
将数据帧dfs
的列表减少为单个未堆叠数据帧 n
。
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
答案 1 :(得分:1)
有一种大锤方法。首先
foo = df.groupby('n')
这是(n, group)
对的列表。对于每个组,您要做
newgroup = pd.concat([group.iloc[0], group.iloc[1]], axis=1)
(您可以在concat中更改列名称)。
最后是垂直pd.concat
个新组。