Python数据帧分割错误:操作不'';安全'';
我试图将Python中Pandas数据帧的一些列规范化为它们的总和。我在数据帧中有以下内容: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
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')
谢谢实际上,我刚刚意识到我链接到()的帖子包含了相同的方法。我认为这对我的数据框架中的非数字列不起作用。通过解释,您的方法更加直观。再次感谢!