我正在努力使用Python pandas
包中的层次索引。具体来说,我不明白如何在数据透视后过滤和比较数据。
以下是文档中的示例表:
import pandas as pd
import numpy as np
In [1027]: df = pd.DataFrame({'A' : ['one', 'one', 'two', 'three'] * 6,
'B' : ['A', 'B', 'C'] * 8,
'C' : ['foo', 'foo', 'foo', 'bar', 'bar', 'bar'] * 4,
'D' : np.random.randn(24),
'E' : np.random.randn(24)})
In [1029]: pd.pivot_table(df, values='D', rows=['A', 'B'], cols=['C'])
Out[1029]:
C bar foo
A B
one A -1.154627 -0.243234
B -1.320253 -0.633158
C 1.188862 0.377300
three A -1.327977 NaN
B NaN -0.079051
C -0.832506 NaN
two A NaN -0.128534
B 0.835120 NaN
C NaN 0.838040
我想分析如下:
1)在列属性上过滤此表,例如选择负foo
:
C bar foo
A B
one A -1.154627 -0.243234
B -1.320253 -0.633158
three B NaN -0.079051
two A NaN -0.128534
2)比较不同B
系列组之间的剩余A
系列值?我不确定如何访问此信息:{'one':['A','B'], 'two':['A'], 'three':['B']}
并确定哪些系列B
值对于每个密钥是唯一的,或者在多个密钥组中看到等等
有没有办法直接在数据透视表结构中执行此操作,还是需要将其转换回pandas
dataframe
?
更新:我认为此代码是朝着正确方向迈出的一步。它至少让我可以访问此表中的各个值,但我仍然在对系列值进行硬编码:
table = pivot_table(df, values='D', rows=['A', 'B'], cols=['C'])
table.ix['one', 'A']
答案 0 :(得分:11)
数据透视表返回一个DataFrame,因此您只需按以下步骤进行过滤:
In [15]: pivoted = pivot_table(df, values='D', rows=['A', 'B'], cols=['C'])
In [16]: pivoted[pivoted.foo < 0]
Out[16]:
C bar foo
A B
one A -0.412628 -1.062175
three B NaN -0.562207
two A NaN -0.007245
您可以使用类似
的内容pivoted.ix['one']
选择所有A系列组
或
pivoted.ix['one', 'A']
选择不同的A和B系列组
答案 1 :(得分:0)
只需在上一个答案中添加信息即可。当您尝试在 python3 中使用pivoted.ix['one']
时,会收到以下消息:
/usr/lib/python3.7/site-packages/ipykernel_launcher.py:7: 弃用警告:不建议使用.ix。请使用.loc作为标签 基于索引或.iloc进行位置索引
在此处查看文档: http://pandas.pydata.org/pandas-docs/stable/indexing.html#ix-indexer-is-deprecated 导入系统
因此,在此版本的python中,请改用以下代码:
pivoted.loc ['one']