Pandas数据框取消数据堆叠并创建新列

时间:2020-06-27 18:15:11

标签: 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    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,它们分别对应于第二组数据并根据{{1 }}?

这就是我想要的:

n

2 个答案:

答案 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个新组。