我有一个同时使用MultiIndex作为索引和列的数据框。 例如:
df = pd.DataFrame(index=pd.MultiIndex.from_product([[1,2], [1,2,3], [4,5]], names=['i','j', 'k']), columns=pd.MultiIndex.from_product([[1,2], [1,2]], names=['x', 'y']))
for c in df.columns:
df[c] = np.random.randint(100, size=(12,1))
x 1 2
y 1 2 1 2
i j k
1 1 4 10 13 0 76
5 92 37 52 40
2 4 88 77 50 22
5 75 31 19 1
3 4 61 23 5 47
5 43 68 10 21
2 1 4 23 15 17 5
5 47 68 6 94
2 4 0 12 24 54
5 83 27 46 19
3 4 7 22 5 15
5 7 10 89 79
我想按索引中的名称和列中的名称对值进行分组。
对于每个这样的组,我们将有一个二维数字数组(而不是序列)。我想汇总该二维数组中所有条目的std()
。
例如,假设我对['i', 'x']
进行分组,则一组将具有值i=1
和x=1
。我想为每个2D数组计算std
,并生成一个DataFrame
,其中i
的值作为索引,x
的值作为列。
实现此目标的最佳方法是什么?
如果我执行stack()
来获取x
作为索引,由于仍然会有多列,我仍将计算多个std()
而不是一个。
答案 0 :(得分:1)
您可以使用stack
将列的“ y”级作为索引,然后仅groupby
才能获得:
print (df.stack(level='y').groupby(['i']).std())
x 1 2
i
1 32.966811 23.933462
2 28.668825 28.541835
答案 1 :(得分:1)
您可以使用嵌套列表推导。以您的示例为例,使用给定类型的DataFrame(这是不一样的,因为值是随机的;您可能需要修复种子值,以便结果可比),并以i
和x
作为索引感兴趣,它将像这样工作:
# get values of the top level row index
rows = set(df.index.get_level_values(0))
# get values of the top level column index
columns = set(df.columns.get_level_values(0))
# for every sub-dataframe (every combination of top-level indices)
# compute sampling standard deviation (1 degree of freedom) across all values
df_groupSD = pd.DataFrame([[df.loc[(row, )][(col, )].values.std(ddof=1)
for col in columns] for row in rows],
index = rows, columns = columns)
# show result
display(df_groupSD)
输出:
1 2
1 31.455115 25.433812
2 29.421699 33.748962
当然可以有更好的方法。
答案 2 :(得分:1)
尝试以下代码:
df.groupby(level=0).apply(lambda grp: grp.stack().std())