Pandas,分组数据的算术运算
Pandas, arithmetic operation on grouped data
假设我有一个 pandas 数据框并且已经分组为
grp=df.groupby(['a','b' ]).sum()
现在我想为每个组 a
计算每列 b
的百分比,
例如:P1, aaaa = 11/484
、P1, aaac = 8/357
、N1, aaaa = 61/7183
等等....
可重现的分组数据
pd.DataFrame({'aaaa': {('P 1', 0): 484,('P 1', 1): 11,}})
你可以这样做:
grp.loc[(slice(None), 1),:].droplevel(1)/grp.loc[(slice(None), 0),:].droplevel(1)
在 grp.loc[(slice(None), 1),:]
和 grp.loc[(slice(None), 0),:]
的实践中,我只提取带有 b==1
和 b==0
的行(自己尝试并查看输出);之后我需要删除 b
级别 (.droplevel(1)
) 以使这两个对象具有相同的索引(列已经共享);最后我用 /
划分了这两个矩阵(现在我可以这样做了,因为现在它们有相同的索引和列)。希望清楚:)
您可以将 xs
用于 MultiIndex 的 select 特定级别:
out = df.xs(1, level=1) / df.xs(0, level=1)
输出:
aaaa
P 1 0.022727
假设我有一个 pandas 数据框并且已经分组为
grp=df.groupby(['a','b' ]).sum()
现在我想为每个组 a
计算每列 b
的百分比,
例如:P1, aaaa = 11/484
、P1, aaac = 8/357
、N1, aaaa = 61/7183
等等....
可重现的分组数据
pd.DataFrame({'aaaa': {('P 1', 0): 484,('P 1', 1): 11,}})
你可以这样做:
grp.loc[(slice(None), 1),:].droplevel(1)/grp.loc[(slice(None), 0),:].droplevel(1)
在 grp.loc[(slice(None), 1),:]
和 grp.loc[(slice(None), 0),:]
的实践中,我只提取带有 b==1
和 b==0
的行(自己尝试并查看输出);之后我需要删除 b
级别 (.droplevel(1)
) 以使这两个对象具有相同的索引(列已经共享);最后我用 /
划分了这两个矩阵(现在我可以这样做了,因为现在它们有相同的索引和列)。希望清楚:)
您可以将 xs
用于 MultiIndex 的 select 特定级别:
out = df.xs(1, level=1) / df.xs(0, level=1)
输出:
aaaa
P 1 0.022727