代码之家  ›  专栏  ›  技术社区  ›  Ari

使用dataframe取消堆叠数据并创建新列

  •  1
  • Ari  · 技术社区  · 4 年前

    我有两组叠加数据,如下所示:

        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 ,对应于第二组数据,并基于 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
    
    1 回复  |  直到 4 年前
        1
  •  2
  •   Shubham Sharma mkln    4 年前

    首先,我们创建一个 dfs 通过使用 DataFrame.groupby 对列上的数据帧进行分组 Set 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
    
        2
  •  1
  •   Igor Rivin    4 年前

    有一种大锤式的方法。弗斯特

    foo = df.groupby('n')
    

    这是一个成对的列表 (n, group) . 每一组,你都有

    newgroup = pd.concat([group.iloc[0], group.iloc[1]], axis=1)
    

    (可以更改concat中的列名)。

    最后呢 pd.concat 新组垂直排列。