Pandas数据框展开数据并创建新列

3

我有两组如下的堆叠数据:

    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_2value_2_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

你想要 n_copy 这一列有什么特殊的原因吗?因为它看起来和 n 完全一样。 - Shubham Sharma
1
不,我可以把它去掉。 - Ari
2个回答

2
首先,我们使用DataFrame.groupby按列 Set 对数据帧进行分组,创建一个dfs列表。接着,对于数据帧中的每个组,我们使用DataFrame.add_suffix将组标识符添加到每个列中:
最后,我们使用functools.reduce来减少数据帧列表dfs到单一的未堆叠数据帧,并在连续的数据帧上应用pd.merge操作来合并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

有一种粗暴的方法。首先

foo = df.groupby('n')

这是一组配对列表(n, group)。针对每个组,您需要进行以下操作。
newgroup = pd.concat([group.iloc[0], group.iloc[1]], axis=1)

您可以在concat中更改列名。

最后,pd.concat垂直地连接新的分组。


我不明白你所说的一组配对列表(n, group)和foo是什么意思。你能否展示所有结果,就像Shubham Sharma的答案一样? - Jack

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接