pandas,多条件切片多索引df
pandas, slice multi-index df with multiple conditions
这个问题是
的延续
我想计算最近 3 个月(2015-12、2015-11、2015-10)的值总和。如果股票没有足够的数据,即 3 个月中有 none、1 或 2 个,那么我希望该总和的值为 NaN。
我可以切片并执行分组和求和,但这并没有给我想要的结果,因为它可能排除了在这三个月期间没有任何数据的股票,然后不考虑股票有1或2个月。
我想我需要一个 multi loc 语句,但我已经进行了修改,但未能获得我想要的结果。
df2.loc[idx[:,datetime.date(2015,10,1):datetime.date(2015,12,1)],:].groupby(level=0).sum()
试试这个:
In [142]: df
Out[142]:
value date stock
0 4 2015-01-01 amzn
1 2 2015-02-01 amzn
2 5 2015-03-01 amzn
3 6 2015-04-01 amzn
4 7 2015-05-01 amzn
5 8 2015-06-01 amzn
6 6 2015-07-01 amzn
7 5 2015-08-01 amzn
8 4 2015-09-01 amzn
9 1 2015-10-01 amzn
10 2 2015-11-01 amzn
11 4 2015-12-01 amzn
12 7 2015-12-02 amzn
In [143]: df[(df['date'] >= pd.to_datetime('2015-10-01'))].groupby(df['date'].dt.month).sum()
Out[143]:
value
date
10 1
11 2
12 11
注意:我特意在您的 DF 中添加了一行,以便至少有一个月多于一行
In [141]: df.loc[12] = [7, pd.to_datetime('2015-12-02'), 'amzn']
更新:
使用以下数据框:
df = pd.DataFrame({
'value' : [4,2,5,6,7,8,6,5,4,1,2,4],
'date': fread_year_month(dt.datetime(2015, 1, 1),dt.datetime(2015, 12, 1)),
'stock': ['amzn']*12
},columns=[
'value', 'date', 'stock'] )
df2 = pd.DataFrame({
'value' : [1]*11,
'date': fread_year_month(dt.datetime(2015, 1, 1),dt.datetime(2015, 11, 1)),
'stock': ['msft']*11
},columns=[
'value', 'date', 'stock'] )
df = df.append(df2)
df.set_index(['stock', 'date'], inplace=True)
我做了以下事情:
In [1]: idx = pd.IndexSlice
In [2]: criterion = df.loc[idx[:,'2015-10-01':'2015-12-01'],:].\
groupby(level=0).agg(['count']) > 2
In [3]: criterion = criterion['value']['count']
In [4]: df2 = df.loc[idx[:,'2015-10-01':'2015-12-01'],:].groupby(level=0).sum()
In [5]: df3 = pd.DataFrame(columns=['value'], index=criterion[criterion==False].index)
In [6]: df2[criterion].append(df3, ignore_index=False)
Out[6]:
value
stock
amzn 7
msft NaN
在此示例中,MSFT 没有 2015-12 年的数据(它只有 3 个月中的 2 个月),因此根据我的要求将其值设置为 NaN。
这个问题是
我想计算最近 3 个月(2015-12、2015-11、2015-10)的值总和。如果股票没有足够的数据,即 3 个月中有 none、1 或 2 个,那么我希望该总和的值为 NaN。
我可以切片并执行分组和求和,但这并没有给我想要的结果,因为它可能排除了在这三个月期间没有任何数据的股票,然后不考虑股票有1或2个月。
我想我需要一个 multi loc 语句,但我已经进行了修改,但未能获得我想要的结果。
df2.loc[idx[:,datetime.date(2015,10,1):datetime.date(2015,12,1)],:].groupby(level=0).sum()
试试这个:
In [142]: df
Out[142]:
value date stock
0 4 2015-01-01 amzn
1 2 2015-02-01 amzn
2 5 2015-03-01 amzn
3 6 2015-04-01 amzn
4 7 2015-05-01 amzn
5 8 2015-06-01 amzn
6 6 2015-07-01 amzn
7 5 2015-08-01 amzn
8 4 2015-09-01 amzn
9 1 2015-10-01 amzn
10 2 2015-11-01 amzn
11 4 2015-12-01 amzn
12 7 2015-12-02 amzn
In [143]: df[(df['date'] >= pd.to_datetime('2015-10-01'))].groupby(df['date'].dt.month).sum()
Out[143]:
value
date
10 1
11 2
12 11
注意:我特意在您的 DF 中添加了一行,以便至少有一个月多于一行
In [141]: df.loc[12] = [7, pd.to_datetime('2015-12-02'), 'amzn']
更新:
使用以下数据框:
df = pd.DataFrame({
'value' : [4,2,5,6,7,8,6,5,4,1,2,4],
'date': fread_year_month(dt.datetime(2015, 1, 1),dt.datetime(2015, 12, 1)),
'stock': ['amzn']*12
},columns=[
'value', 'date', 'stock'] )
df2 = pd.DataFrame({
'value' : [1]*11,
'date': fread_year_month(dt.datetime(2015, 1, 1),dt.datetime(2015, 11, 1)),
'stock': ['msft']*11
},columns=[
'value', 'date', 'stock'] )
df = df.append(df2)
df.set_index(['stock', 'date'], inplace=True)
我做了以下事情:
In [1]: idx = pd.IndexSlice
In [2]: criterion = df.loc[idx[:,'2015-10-01':'2015-12-01'],:].\
groupby(level=0).agg(['count']) > 2
In [3]: criterion = criterion['value']['count']
In [4]: df2 = df.loc[idx[:,'2015-10-01':'2015-12-01'],:].groupby(level=0).sum()
In [5]: df3 = pd.DataFrame(columns=['value'], index=criterion[criterion==False].index)
In [6]: df2[criterion].append(df3, ignore_index=False)
Out[6]:
value
stock
amzn 7
msft NaN
在此示例中,MSFT 没有 2015-12 年的数据(它只有 3 个月中的 2 个月),因此根据我的要求将其值设置为 NaN。