【问题标题】:Pivoting a Series in Pandas在 Pandas 中旋转系列
【发布时间】:2018-02-21 19:19:08
【问题描述】:

我有一个看起来像这样的系列:

Area        Classification         Samples
88          500m-1bi               34
94          500m-1bi               112
09          500m-1bi               912
            >1bi                   31
81          <1m                    6574
87          100-500m               12
...

我希望“分类”标签成为列,而“样本”成为值,所以它看起来像这样:

Area       <1m    100-500m     500-1bi      >1bi  
88                             34
94                             112
09                             912          31
81         6574
87                12
...

我试过了:

df.pivot(columns='Classification', values='Samples')

但是当我这样做时,我会得到AttributeError: 'Series' object has no attribute 'pivot'

所以我试着把它变成一个Dataframe:

df.to_frame().pivot(columns='Classification', values='Samples')

在这种情况下,我得到:

KeyError: 'Classification'

你知道如何解决吗?

** 编辑 **

这个系列是从 groupby 函数中获得的:

df=df.groupby(['Area','Classification']).agg('count').sort_values('Samples')['Samples']

【问题讨论】:

  • 你是如何创建上述系列的?系列通常是一维的......当你这样做时你会得到什么df.values
  • 我从 groupby 函数中得到它: df=df.groupby(['Area','Classification']).agg('count').sort_values('code')[ '代码']。 “示例”实际上是“代码”,我使用示例是因为它似乎更易于理解
  • 如果你只做 df.unstack() 会发生什么(其中 df 是系列 post-agg)
  • 当我做 df.values 我得到 [ 34 112 912 ...]
  • 噢,我需要做的就是 df.unstack()。工作完美。问题解决了。

标签: python pandas pivot series


【解决方案1】:

这个例子稍微修改了 df。在 Area 中添加了 10 来填补空白:

Area        Classification         Samples
88          500m-1bi               34
94          500m-1bi               112
09          500m-1bi               912
10          >1bi                   31
81          <1m                    6574
87          100-500m               12

你需要设置索引然后unstack:

df.set_index(['Area', 'Classification']).unstack()

输出:

                Samples                       
Classification 100-500m 500m-1bi     <1m  >1bi
Area                                          
9                   NaN    912.0     NaN   NaN
10                  NaN      NaN     NaN  31.0
81                  NaN      NaN  6574.0   NaN
87                 12.0      NaN     NaN   NaN
88                  NaN     34.0     NaN   NaN
94                  NaN    112.0     NaN   NaN

【讨论】:

  • 谢谢@ChuHo!但是我得到 AttributeError: 'Series' object has no attribute 'set_index'。
  • 您需要将您的系列更改为数据框。试试df = pd.DataFrame('your_series_here')
  • 做到了。现在我得到: KeyError: 'Area'
【解决方案2】:

以防万一您的数据框中有更多列,并且您希望仅针对“样本”功能取消堆叠:

copy = df.set_index(['Area', 'Classification']) # Multi-Index
result = copy['Samples'].unstack() # unstack separately

然后您可以使用concat 将所有内容放在一起(添加未触及的列)(因为您使用的是 df 的副本,所以现在处理索引没有问题)。

df = pd.concat([df, result], axis=1)

'ignore_index' 默认为 False,所以你完成了。

【讨论】:

    猜你喜欢
    • 2018-03-24
    • 2018-02-27
    • 1970-01-01
    • 2023-04-04
    • 2014-01-16
    • 1970-01-01
    • 2015-03-23
    • 2021-11-24
    • 1970-01-01
    相关资源
    最近更新 更多