Python 熊猫用它的总数来划分行
我有这个df: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”
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