pandas 将行除以总数
pandas dividing rows by its total
我有这个 df:
Name num1 num2 num3
A 1 2 3
B 4 5 6
C 7 8 9
我的目标是将每一行除以总数。这是我想出的:
df.loc[:,"num1":"num3"] = df.loc[:,"num1":"num3"].div(df["total"], axis=0)
效果很好。但是,如果在 num3 之后添加了更多 "numx" 列,我将不得不手动将代码更新为 "num1":"numx"。有没有办法解决这个问题?
你需要select_dtypes
df.loc[:,df.select_dtypes(exclude='object').columns]=df.select_dtypes(exclude='object').div(df.select_dtypes(exclude='object').sum(1),0)
df
Out[66]:
Name num1 num2 num3
0 A 0.166667 0.333333 0.500
1 B 0.266667 0.333333 0.400
2 C 0.291667 0.333333 0.375
第 select 个匹配列:
In [21]: cols = df.columns[df.columns.str.contains('^num\d+')]
然后将这些行中的元素除以它们的总和(为每一行计算):
In [22]: df[cols] = df[cols].div(df[cols].sum(axis=1), axis=0)
In [23]: df
Out[23]:
Name num1 num2 num3
0 A 0.166667 0.333333 0.500
1 B 0.266667 0.333333 0.400
2 C 0.291667 0.333333 0.375
您可以使用应用函数并在每一行上应用除法。它会给出相同的结果。
df = df.apply(lambda x = x.div(x.sum()), axis=1)
我有这个 df:
Name num1 num2 num3
A 1 2 3
B 4 5 6
C 7 8 9
我的目标是将每一行除以总数。这是我想出的:
df.loc[:,"num1":"num3"] = df.loc[:,"num1":"num3"].div(df["total"], axis=0)
效果很好。但是,如果在 num3 之后添加了更多 "numx" 列,我将不得不手动将代码更新为 "num1":"numx"。有没有办法解决这个问题?
你需要select_dtypes
df.loc[:,df.select_dtypes(exclude='object').columns]=df.select_dtypes(exclude='object').div(df.select_dtypes(exclude='object').sum(1),0)
df
Out[66]:
Name num1 num2 num3
0 A 0.166667 0.333333 0.500
1 B 0.266667 0.333333 0.400
2 C 0.291667 0.333333 0.375
第 select 个匹配列:
In [21]: cols = df.columns[df.columns.str.contains('^num\d+')]
然后将这些行中的元素除以它们的总和(为每一行计算):
In [22]: df[cols] = df[cols].div(df[cols].sum(axis=1), axis=0)
In [23]: df
Out[23]:
Name num1 num2 num3
0 A 0.166667 0.333333 0.500
1 B 0.266667 0.333333 0.400
2 C 0.291667 0.333333 0.375
您可以使用应用函数并在每一行上应用除法。它会给出相同的结果。
df = df.apply(lambda x = x.div(x.sum()), axis=1)