熊猫:如何查询多级列

时间:2014-05-26 13:38:47

标签: python select pandas

Blet采用以下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'

由于

2 个答案:

答案 0 :(得分:0)

为什么放弃指数?它们包含有用的信息(也就是说,您为了获取数据而分组的内容 - 当您想根据分组进行计算时,很可能需要这样做:))

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首先),但我们在这里给你的是一个起点:)

答案 1 :(得分:0)

如果您需要从未堆叠的数据框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