我正在尝试将Python中Pandas DataFrame的某些列标准化为它们的总和。我有以下DataFrame:
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
标准化为其显示的总和here - 将每个元素划分为一行通过4个元素的总和。
第一部分似乎工作正常 - 我得到每行的最后4列的总和:
x,y = df.sum(axis=1).tolist()
因此,列表[x,y]
给出了第一行和第二行(最后4列)的总和。但是,当我尝试将每行的所有DataFrame条目除以该行的总和时,我遇到了问题:
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''
当我使用print df.dtypes
时,我会收到所有列的float64
,所以我不确定为什么该分区不安全。
有吗
答案 0 :(得分:2)
试试这个:
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')