微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python – 如何最好地使用pandas.DataFrame.pivot?

我试图将一个数据帧从键,值的行转换为一个表,其中键作为列,值作为单元格.例如:

使用键输入数据帧,值:

>>>df = pd.DataFrame([['TIME', 'VAL1', 'VAL2', 'VAL3', 
                       'TIME', 'VAL1', 'VAL2', 'VAL3'],
                      ["00:00:01",1,2,3,"00:00:02", 1,2,3]]).T

    0       1
0   TIME    00:00:01
1   VAL1    1
2   VAL2    2
3   VAL3    3
4   TIME    00:00:02
5   VAL1    1
6   VAL2    2
7   VAL3    3

我希望它看起来像:

TIME      VAL1 VAL2 VAL3
00:00:01  1    2    3
00:00:02  1    2    3

我几乎可以用枢轴得到我想要的东西:

>>>df.pivot(columns=0, values=1)
    TIME        VAL1    VAL2    VAL3
0   00:00:01    None    None    None
1   None        1       None    None
2   None        None    2       None
3   None        None    None    3
4   00:00:02    None    None    None
5   None        1       None    None
6   None        None    2       None
7   None        None    None    3

我可以合并行来获得我想要的东西:

>>> df.pivot(columns=0, values=1).ffill().drop_duplicates(subset='TIME',
                                                          keep='last').set_index('TIME')
TIME      VAL1 VAL2 VAL3
00:00:01  1    2    3
00:00:02  1    2    3

但这似乎是一种相当尴尬的方式,它会浪费大量数据集的大量内存.有更简单的方法吗?

我厌倦了看pd.DataFrame.from_items()和pd.DataFrame.from_records(),但没有成功.

解决方法:

您需要一个“ID”变量来指示哪些行组合在一起.在您想要的输出中,您隐含地假设每个4行的块应该成为单行,但是pandas不会假设这一点,因为通常,旋转应该能够将非连续行组合在一起.要在新DataFrame中成为单行的每组行必须具有一些共享值.

如果您的数据实际上只是四行的块,您可以像这样创建ID变量:

df['ID'] = np.arange(len(df))//4

您可以看到ID变量现在标记应分组的行:

>>> df
      0         1  ID
0  TIME  00:00:01   0
1  VAL1         1   0
2  VAL2         2   0
3  VAL3         3   0
4  TIME  00:00:02   1
5  VAL1         1   1
6  VAL2         2   1
7  VAL3         3   1

然后使用此新列作为数据透视表的“索引”.

>>> df.pivot(index="ID", columns=0, values=1)
0       TIME VAL1 VAL2 VAL3
ID                         
0   00:00:01    1    2    3
1   00:00:02    1    2    3

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐