规范化多索引数据框中的值?

use*_*737 3 normalize multi-index dataframe pandas

如何规范化多索引数据框?

假设我有数据帧:

d = pd.DataFrame([["a",1,3],["a",2,2],["b",4,4],["b",5,8]], 
                  columns=["name","value1","value2"])
Run Code Online (Sandbox Code Playgroud)

如何计算每个"名称"的标准化值?

我知道如何规范化基本数据帧:

d = (d-d.mean(axis=0))/data.std(axis=0, ddof=1)
Run Code Online (Sandbox Code Playgroud)

但是我无法在我的数据帧的每个"名称"组中应用它

所以我想要的结果是:

name, value1, value2
a     -0.5     0.5
a      0.5    -0.5
b     -0.5    -1
b      0.5     1
Run Code Online (Sandbox Code Playgroud)

我尝试了groupby和一个多索引数据框,但可能我没有以正确的方式做到这一点

Dan*_*lan 7

按组规范化是groupby文档中的示例之一.但它并没有完全符合您的要求.

In [2]: d.groupby('name').transform(lambda x: (x-x.mean())/x.std(ddof=1))
Out[2]: 
     value1    value2
0 -0.707107  0.707107
1  0.707107 -0.707107
2 -0.707107 -0.707107
3  0.707107  0.707107
Run Code Online (Sandbox Code Playgroud)

你期望的结果表明,你真的想参照元素正常化每个名称组中的值value1value2.对于类似的东西,您可以单独为每个组应用一个函数,然后重新组合结果.

In [3]: def normalize(group):                                                      
    mean = group.values.ravel().mean()
    std = group.values.ravel().std(ddof=1)
    return group.applymap(lambda x: (x - mean)/std)
   ....: 

In [4]: pd.concat([normalize(group) for _, group in d.set_index('name').groupby(level=0)])
Out[4]: 
        value1    value2
name                    
a    -1.224745  1.224745
a     0.000000  0.000000
b    -0.660338 -0.660338
b    -0.132068  1.452744
Run Code Online (Sandbox Code Playgroud)