Python Pandas数据帧划分错误:操作不''安全''

时间:2016-10-11 20:21:37

标签: python pandas dataframe divide

我正在尝试将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'])

我想将列A1A2A3A4标准化为其显示的总和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,所以我不确定为什么该分区不安全。

有吗

1 个答案:

答案 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')