让我们取下面的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
您可以考虑比检查组长度更好的条件(如果您有0
或NaN
销售的条目,这将变得稍微复杂-您必须先过滤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