python-3.x 如何在透视数据时维护列名,而不进行聚合,也不使用人工索引?

qq24tv8q  于 2022-12-05  发布在  Python
关注(0)|答案(1)|浏览(116)

我有一个类似这样的 Dataframe ,它在key列中有大约40个唯一值,其中一些是整数。如果可能的话,我不希望任何东西被聚合:

hash  ft  timestamp               id   key   value
1ab   1   2022-01-02 12:21:11     1    aaa   121289
1ab   1   2022-01-02 12:21:11     1    bbb   13ADF
1ab   1   2022-01-02 12:21:11     2    aaa   13ADH
1ab   1   2022-01-02 12:21:11     2    bbb   13ADH
2ab   2   2022-01-02 12:21:11     3    aaa   121382
2ab   2   2022-01-02 12:21:11     3    bbb   121381
2ab   2   2022-01-02 12:21:11     3    ccc   121389

我试图只透视keyvalue列上的2的数据,同时保留其余相同的列和索引。示例:

当我运行下面的代码时,列名采用分组值,其中columnname为以下各列的值id, ft, value。实际列名之一,带括号:('id', '1', '121289'),我被迫选择一个索引,这是我不想做的。
编码:df.pivot_table(index='hash',columns=['ft','key'])
我不知道我做错了什么,我不能使用value列来表示values。我得到了一个空的 Dataframe :

df.pivot_table(index='hash',columns=['ft','key'], values='value')
lf5gs5x2

lf5gs5x21#

使用pandas.DataFrame.pivot的可能解决方案:

(df.pivot(index=['hash', 'ft', 'id', 'timestamp'],
          columns=['key'], values='value')
 .reset_index().rename_axis(None, axis=1))

输出量:

hash  ft  id            timestamp     aaa     bbb     ccc
0  1ab   1   1  2022-01-02 12:21:11  121289   13ADF     NaN
1  1ab   1   2  2022-01-02 12:21:11   13ADH   13ADH     NaN
2  2ab   2   3  2022-01-02 12:21:11  121382  121381  121389

数据来源:

df = pd.DataFrame.from_dict(
    {'hash': {0: '1ab',
  1: '1ab',
  2: '1ab',
  3: '1ab',
  4: '2ab',
  5: '2ab',
  6: '2ab'},
 'ft': {0: 1, 1: 1, 2: 1, 3: 1, 4: 2, 5: 2, 6: 2},
 'timestamp': {0: '2022-01-02 12:21:11',
  1: '2022-01-02 12:21:11',
  2: '2022-01-02 12:21:11',
  3: '2022-01-02 12:21:11',
  4: '2022-01-02 12:21:11',
  5: '2022-01-02 12:21:11',
  6: '2022-01-02 12:21:11'},
 'id': {0: 1, 1: 1, 2: 2, 3: 2, 4: 3, 5: 3, 6: 3},
 'key': {0: 'aaa', 1: 'bbb', 2: 'aaa', 3: 'bbb', 4: 'aaa', 5: 'bbb', 6: 'ccc'},
 'value': {0: '121289',
  1: '13ADF',
  2: '13ADH',
  3: '13ADH',
  4: '121382',
  5: '121381',
  6: '121389'}}
)

编辑

为了克服下文报告的一个错误,执行主任在一份评论中提出了以下解决办法:

(pd.pivot_table(df,index=['hash','ft', 'id'] ,
                columns = ['key'] , 
                values = "value", aggfunc='sum')
 .reset_index().rename_axis(None, axis=1))

相关问题