python - 根据 Pandas 中的行值划分列

标签 python pandas

我试图在 Pandas 中进行一个看起来很明显的计算,但经过几次尝试后我没有找到正确的方法。

我有一个如下所示的数据框:

df = pd.DataFrame([["A", "a", 10.0],
                   ["A", "b", 12.0],
                   ["A", "c", 13.0],
                   ["B", "a", 5.0 ],
                   ["B", "b", 6.0 ],
                   ["B", "c", 7.0 ]])

第一列是测试名,第二列是类,第三列是时间。每个测试通常显示在包含 3 个类的表中。

这是绘制它的正确格式:

sns.factorplot(x="2", y="0", hue="1", data=df,
               kind="bar")

因此对于每个测试,我得到一组 3 个条,每个类一个。

但是我想更改数据框,以便第 2 列中的每个值都不是绝对值,而是与类“a”相比的比率。

所以我想把它改成这样:

df = pd.DataFrame([["A", "a", 1.0],
                   ["A", "b", 1.2],
                   ["A", "c", 1.3],
                   ["B", "a", 1.0],
                   ["B", "b", 1.2],
                   ["B", "c", 1.4]])

我能够提取系列,更改索引以使它们匹配,进行计算,例如:

df_a = df[df[1] == "a"].set_index(0)
df_b = df[df[1] == "b"].set_index(0)
df_b["ratio_a"] = df_b[2] / df_a[2]

但这肯定是非常低效的,我需要将它分组回格式。

正确的做法是什么?

最佳答案

你可以使用 groupby/transform('first')找到每组中的第一个值:

import pandas as pd
df = pd.DataFrame([["A", "a", 10.0],
                   ["A", "b", 12.0],
                   ["A", "c", 13.0],
                   ["B", "b", 6.0 ],
                   ["B", "a", 5.0 ],
                   ["B", "c", 7.0 ]])
df = df.sort_values(by=[0,1])
df[2] /= df.groupby(0)[2].transform('first')

产量

   0  1    2
0  A  a  1.0
1  A  b  1.2
2  A  c  1.3
3  B  a  1.0
4  B  b  1.2
5  B  c  1.4

关于python - 根据 Pandas 中的行值划分列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41000202/

相关文章:

python - 在 Windows 10 上使用 pip install xx.whl 安装 rpy2

python - 如何删除包括所有 child 的实体

python - 将我的 IP 地址连接到 flask 服务器时出错 - ubuntu ipython

pandas - 将大型数据集与 dask 合并

python - 使用多个条件删除 pandas 中的重复行

python - 如何在Python中运行循环并每次返回到不同的列表

python - (numpy) __array_wrap__ 做什么?

python - 为什么我的迭代器实现效率很低?

python - 删除不包含数字的列名

Python类声明 "positional argument"错误