这就是我正在努力做的.我在pandas中有以下DataFrame:
import numpy as np
import pandas as pd
n_cols = 3
n_samples = 4
df = pd.DataFrame(np.arange(n_samples * n_cols).reshape(n_samples, n_cols), columns=list('ABC'))
print(df)
输出:
A B C
0 0 1 2
1 3 4 5
2 6 7 8
3 9 10 11
我有每个样本(行)所属的类别:
cat = pd.Series([1,1,2,2])
我有一个与每个类别相关的引用行:
df_ref = pd.DataFrame(np.zeros((2, n_cols)), index=[1,2], columns=list('ABC'))
df_ref.loc[1] = 10
print(df_ref)
输出:
A B C
1 10.0 10.0 10.0
2 0.0 0.0 0.0
如何以更优雅的方式完成以下操作(例如,使用Groupby和Transform):
result = df.copy()
for i in range(n_cols):
result.iloc[i] = df.iloc[i] - df_ref.loc[cat[i]]
print(results)
输出:
A B C
0 -10 -9 -8
1 -7 -6 -5
2 6 7 8
3 9 10 11
我想像这样的事情应该行得通:
df.groupby(cat).transform(lambda x: x - df_ref.loc[x.GROUP_NAME])
其中x. GROUP_NAME访问正在对其进行转换操作的组的名称.在pandas documentation about transform中,它写道:"每个组都被赋予属性'name',以防你需要知道你正在处理哪个组."我试图访问www.example.com,但那给出了一个专栏的名称,而不是组的名称.所以我不明白这些文档指的是什么.