Pandas:如何查询多级列



让我们取下面的DataFrame:

import pandas as pd
df = pd.DataFrame({
'Region' : ['A', 'A', 'C', 'C', 'C', 'B'],
'Store' : ['A', ' B ', 'A ', 'B ', 'A ', 'A'],
'Quantity': [1, 1, 2, 3, 4, 5],
'Date' : ['2009-04-05','2009-04-05','2010-05-05', '2009-08-05', '2011-02-05', '2009-04-05']})
df['Date'] = df['Date'].apply(lambda x: pd.to_datetime(x))
df.set_index(['Date','Region','Store'], inplace=True)
df_1 = df.unstack(level=[1,2])

使用结果DataFrame df_1,我如何找到商店A和B在同一地区销售产品的日期?作为这个问题的答案,查询应该只返回日期'2009-04-05'

谢谢

为什么去掉索引?它们包含有用的信息(即,您分组以获得数据的内容—当您想要根据分组进行计算时,很可能需要这些信息:))!

df.groupby(level=[0,1]).apply(lambda x: len(x)==2)

给我

Out[197]: 
Date        Region
2009-04-05  A          True
            B         False
2009-08-05  C         False
2010-05-05  C         False
2011-02-05  C         False
dtype: bool

您可以考虑比检查组长度更好的条件(如果您有0NaN销售的条目,这将变得稍微复杂-您必须先过滤x),但我们在这里给您的只是一个起点:)

如果您需要从未堆叠的数据帧df_1开始,我认为您可以执行以下操作。我把它分成几个步骤,这样你就能看到我在做什么。当然,您可以将许多步骤串联起来。

In [61]: df_2 = df_1.applymap(lambda x: 1 if pd.notnull (x) else 0)
In [62]: df_2
Out[62]: 
            Quantity             
Region             A      C     B
Store              A   B  A  B  A
Date                             
2009-04-05         1   1  0  0  1
2009-08-05         0   0  0  1  0
2010-05-05         0   0  1  0  0
2011-02-05         0   0  1  0  0
[4 rows x 5 columns]
In [63]: df_3 = df_2.sum(level=1,axis=1)
In [64]: df_3
Out[64]: 
Region      A  B  C
Date               
2009-04-05  2  1  0
2009-08-05  0  0  1
2010-05-05  0  0  1
2011-02-05  0  0  1
[4 rows x 3 columns]
In [65]: print df_3[df_3>=2].dropna(how='all').index
<class 'pandas.tseries.index.DatetimeIndex'>
[2009-04-05]
Length: 1, Freq: None, Timezone: None

最新更新