Python 熊猫用它的总数来划分行

Python 熊猫用它的总数来划分行,python,pandas,row,division,Python,Pandas,Row,Division,我有这个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”

我有这个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”。有办法解决这个问题吗

您需要
选择数据类型

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

首先选择匹配列:

In [21]: cols = df.columns[df.columns.str.contains('^num\d+')]
然后将这些行中的元素除以它们的总和(为每行计算):


你能解释一下这里发生了什么吗?@Wen我得到了TypeError:include和exclude必须都是非字符串的sequences@TylerNG嗯,看起来我对代码没问题,你能用你的示例数据帧试试吗?@Wen我现在得到了:)一如既往地感谢你!是否要动态计算列?是否可能重复?@Usernamenotfound这将是目标。我认为这是不可能的。为什么不创建一个函数来重新计算列并在每次更新后调用它呢?回答得不错!如果我只有1,2,3而不是num1,num2,num3,这会发生什么变化?@TylerNG,你是指数字还是字符串?我将1,2,3转换为strings@TylerNG,然后使用
cols=df.columns[df.columns.str.contains('^\d+')]
@TylerNG,这很简单:
cols=df.columns[df.columns.astype(str).str.contains('^\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