基于标准的熊猫数据透视表过滤

时间:2018-03-28 22:26:58

标签: python pandas pandas-groupby

所以我有一个pivot_table,基本上是一个多级df,我想通过几个参数进行过滤。

colum dtypes:

Report          object
Owner           object
Description     object
TimeToRun       object
FacilityName    object
Base Report     object

pd func:

pv=pd.pivot_table(test, index = ['TimeToRun'], columns = ['FacilityName'], values = ['Base Report'], aggfunc='count', fill_value=0)

pv.columns

MultiIndex(levels=[[u'Base Report'], [u'Roseville', u'Sacramento', u'South Sacramento']],
       labels=[[0, 0, 0], [0, 1, 2]],
       names=[None, u'FacName'])

我的想法是我希望通过第二级值过滤生成的df,我想过滤它,以便将任何大于2的值编入索引。到目前为止,这是我的解决方案,但这在动态情况下不起作用,其中第二级[u'Roseville', u'Sacramento', u'South Sacramento']中的值不同(列的长度)。

这是我的问题:

query = pv[(pv[pv.columns[0]]>2) | (pv[pv.columns[1]]>2)| (pv[pv.columns[2]]>2)]

这里是pivot_table的外观,在excel中呈现:

    Base Report 
FacilityName        Santa Clara Santa Teresa
TimeToRun       
2018-03-28 07:00:00    4    0
2018-03-28 07:01:00    4    0
2018-03-28 07:02:00    6    0
2018-03-28 07:03:00    5    0
2018-03-28 09:05:00    0    3
2018-03-28 09:15:00    0    6
2018-03-28 14:45:00    3    0
2018-03-28 17:15:00    0    5
2018-03-28 19:10:00    0    3
2018-03-28 19:15:00    0    4

我确信有更好的方法,请告诉我如何。谢谢

2 个答案:

答案 0 :(得分:0)

如何迭代列并删除那些不符合计数标准的列?

for col in pv.columns:
    if not any(pv[col] > 2):
        pv.drop(col,axis=1,inplace=True)

答案 1 :(得分:0)

想出来:

pv[pv[('Base Report')]>2].dropna(axis=0,how='all')

您也可以将其应用到位或者只是将其退回......谢谢!

下面的结果,请注意空白为0值:

None    Base Report Base Report
FacilityName    Santa Clara Santa Teresa
TimeToRun       
2018-03-29 07:00:00 4.0 
2018-03-29 07:01:00 4.0 
2018-03-29 07:02:00 6.0 
2018-03-29 07:03:00 5.0 
2018-03-29 09:05:00     3.0
2018-03-29 09:15:00     6.0
2018-03-29 14:45:00 3.0 
2018-03-29 17:15:00     5.0
2018-03-29 19:10:00     3.0
2018-03-29 19:15:00     4.0