我试图在 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/