Python数据帧分割错误:操作不'';安全'';

Python数据帧分割错误:操作不'';安全'';,python,pandas,dataframe,divide,Python,Pandas,Dataframe,Divide,我试图将Python中Pandas数据帧的一些列规范化为它们的总和。我在数据帧中有以下内容: import pandas as pd l_a_2015 = ['Farh','Rob_Sens','Pressure','Septic',10.0,45.,52.,72.51] l_a_2010 = ['Water_Column','Log','Humid','Top_Tank',58.64,35.42,10.,30.] df = pd.DataFrame([l_a_2010,l_a_2015],c

我试图将Python中Pandas数据帧的一些列规范化为它们的总和。我在数据帧中有以下内容:

import pandas as pd
l_a_2015 = ['Farh','Rob_Sens','Pressure','Septic',10.0,45.,52.,72.51]
l_a_2010 = ['Water_Column','Log','Humid','Top_Tank',58.64,35.42,10.,30.]

df = pd.DataFrame([l_a_2010,l_a_2015],columns=['Output_A','Tonnes_Rem',
                                               'Log_Act_All','Readout','A1','A2','A3','A4'])
我想将列
A1
A2
A3
A4
规范化为它们的总和,如图所示-将行中的每个元素除以4个元素的总和

第一部分似乎工作正常-我得到每行最后4列的总和,如下所示:

x,y = df.sum(axis=1).tolist()
因此,列表
[x,y]
给出了第一行和第二行(最后4列)的总和。但是,当我尝试将每行上的所有数据帧条目除以该行的总和时,我遇到了以下问题:

for b,n in enumerate([x,y]):
    for f,elem in enumerate(list(df)[4:]):
        df.iloc[b,f] = (df.iloc[b,f]/n)*100.
我得到以下错误:

[Traceback (most recent call last):134.06, 179.50999999999999]

  File "C:\test.py", line 13, in <module>
    df.iloc[b,f] = (df.iloc[b,f]/n)*100.
TypeError: ufunc 'divide' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''
[回溯(最近一次通话):134.06179.509999999]
文件“C:\test.py”,第13行,在
df.iloc[b,f]=(df.iloc[b,f]/n)*100。
TypeError:输入类型不支持ufunc“divide”,并且无法根据强制转换规则“safe”将输入安全强制为任何支持的类型
当我使用
print df.dtypes
时,我得到所有列的
float64
,因此我不确定分区为什么不安全

有没有

试试这个:

In [5]: df
Out[5]:
       Output_A Tonnes_Rem Log_Act_All   Readout     A1     A2    A3     A4
0  Water_Column        Log       Humid  Top_Tank  58.64  35.42  10.0  30.00
1          Farh   Rob_Sens    Pressure    Septic  10.00  45.00  52.0  72.51

In [8]: cols = df.select_dtypes(include=['number']).columns.tolist()

In [9]: cols
Out[9]: ['A1', 'A2', 'A3', 'A4']
让我们创建一个仅包含数字列的视图:

In [10]: v = df[cols]

In [13]: df[cols] = v.div(v.sum(axis=1), 0)

In [14]: df
Out[14]:
       Output_A Tonnes_Rem Log_Act_All   Readout        A1        A2        A3        A4
0  Water_Column        Log       Humid  Top_Tank  0.437416  0.264210  0.074593  0.223780
1          Farh   Rob_Sens    Pressure    Septic  0.055707  0.250682  0.289677  0.403933
选择
A*
列的另一种方法:

In [18]: df.filter(regex='^A\d+')
Out[18]:
         A1        A2        A3        A4
0  0.437416  0.264210  0.074593  0.223780
1  0.055707  0.250682  0.289677  0.403933

In [19]: df.filter(regex='^A\d+').columns
Out[19]: Index(['A1', 'A2', 'A3', 'A4'], dtype='object')

谢谢实际上,我刚刚意识到我链接到()的帖子包含了相同的方法。我认为这对我的数据框架中的非数字列不起作用。通过解释,您的方法更加直观。再次感谢!