这就是我正在努力做的.我在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,但那给出了一个专栏的名称,而不是组的名称.所以我不明白这些文档指的是什么.

推荐答案

不需要grouby,只需reindex df_ref并转换为数组:

df -= df_ref.reindex(cat).values

或者,复制:

out = df.sub(df_ref.reindex(cat).values)

请注意,您的方法将与groupby.apply:

out = df.groupby(cat, group_keys=False).apply(lambda x: x - df_ref.loc[x.name])

输出:

      A     B     C
0 -10.0  -9.0  -8.0
1  -7.0  -6.0  -5.0
2   6.0   7.0   8.0
3   9.0  10.0  11.0

Python相关问答推荐

三个给定的坐标可以是矩形的点吗

为什么tkinter框架没有被隐藏?

PywinAuto在Windows 11上引发了Memory错误,但在Windows 10上未引发

Python上的Instagram API:缺少client_id参数"

删除任何仅包含字符(或不包含其他数字值的邮政编码)的观察

海上重叠直方图

Python Pandas获取层次路径直到顶层管理

为什么\b在这个正则表达式中不解释为反斜杠

使用Python从rotowire中抓取MLB每日阵容

人口全部乱序 - Python—Matplotlib—映射

如何在Python请求中组合多个适配器?

在用于Python的Bokeh包中设置按钮的样式

如何将一组组合框重置回无 Select tkinter?

如何求相邻对序列中元素 Select 的最小代价

提取数组每行的非零元素

没有内置pip模块的Python3.11--S在做什么?

如何为需要初始化的具体类实现依赖反转和接口分离?

来自Airflow Connection的额外参数

递归链表反转与打印语句挂起

了解如何让库认识到我具有所需的依赖项