我需要在MultiIndex DataFrame上进行.expanding
计算。但我需要它反过来运行。这是一个示例DataFrame:
np.random.seed(456)
j = [(a, b) for a in ['A','B','C'] for b in pd.date_range('2018-01-01', periods=5, freq='W')]
i = pd.MultiIndex.from_tuples(j, names=['Name','Num'])
df = pd.DataFrame(np.random.randn(15), i, columns=['Vals'])
df.loc[df['Vals'] < 0] = np.nan
以下是我想为每个0级索引值做的事情的示例:
k = df.loc['A']
k['Missing'] = k[::-1].isnull().expanding().sum() # Expanding-sum on reversed level-1
这会为该顶级值'A'
生成正确的结果:
Vals Missing
Num
2018-01-07 NaN 2.0
2018-01-14 NaN 1.0
2018-01-21 0.618576 0.0
2018-01-28 0.568692 0.0
2018-02-04 1.350509 0.0
但是如何将其应用于所有顶级索引值,以便我可以设置df['Missing'] =
?
我正在尝试使用df.groupby('Name')[::-1].isnull().expanding().sum()
形式的内容...但我无法获得一个函数形式,允许在计算时反转第一级索引。
这是做什么的熊猫表达?
答案 0 :(得分:0)
知道了:在分组之后,我们必须在处理内部集合之前从MultiIndex中剥离顶层:
df['Missing'] = df.groupby('Name').apply(
lambda x: x.reset_index(level=0, drop=True)[::-1].isnull().expanding().sum()
)
即我们groupby('Name')
,然后对于每个组,lambda表达式通过.reset_index(level=0, drop=True)
剥离level-0索引,此时我们可以以相反的顺序使用剩余的DataFrame:{{1} }。