如何仅将

时间:2017-01-29 06:25:20

标签: python pandas

  1. 我使用pd.read_excel()
  2. 读取了一个Excel文件
  3. 其中一列名为'Energy Supply',包含字符串和数字
  4. 我使用以下代码:
  5. for x in energy['Energy Supply']: print(type(x))

    结果样本是:

    <class 'str'>
    <class 'int'>
    <class 'float'>
    

    我需要将此列中的数值乘以一百万。

    我尝试了以下代码,但没有说法:

      

    unorderable类型:str()&gt; INT()

    for x in energy['Energy Supply']:
        if type(x) != 'str':
            while x>0:
                x = x*1000000
    

    我试过了:

    energy['Energy Supply'].select_dtypes(include=['int64']) * 1000000
    

    但它说:

      

    AttributeError:'Series'对象没有属性'select_dtypes'

    我试过了:

    energy['Energy Supply'] = [x * 1000000 for (type(x)=='int' 
                                                & x in energy['Energy Supply'])]
    

    但是语法错误。

    两者都没有奏效:

    energy.multiply(1000000, axis='Energy Supply', level=None, fill_value=None)
    

    以下行不会给我错误,但它没有做任何事情:

    energy[energy.select_dtypes(include=['number']).columns] *= 1000000
    

    如果有人能帮助我如何做到这一点,我真的很感激。

3 个答案:

答案 0 :(得分:2)

您可以使用由maskto_numeric创建的掩码notnull

energy = pd.DataFrame({'Energy Supply':[10, 1.0,'a']})
print(energy)
  Energy Supply
0            10
1             1
2             a

mask = pd.to_numeric(energy['Energy Supply'], errors='coerce').notnull()
print (mask)
0     True
1     True
2    False
Name: Energy Supply, dtype: bool

另一个解决方案是检查types

mask = energy['Energy Supply'].apply(lambda x: type(x) in [int, float])
print (mask)
0     True
1     True
2    False
Name: Energy Supply, dtype: bool

energy['Energy Supply'] = energy['Energy Supply'].mask(mask, 
                                                       energy['Energy Supply'] * 1000000)
print (energy)
  Energy Supply
0      10000000
1         1e+06
2             a

mask可以使用loc仅用于选择数字值:

print (energy.loc[mask, 'Energy Supply'])
0    10
1     1
Name: Energy Supply, dtype: object

energy.loc[mask, 'Energy Supply'] = energy.loc[mask, 'Energy Supply'] * 1000000
print (energy)
  Energy Supply
0      10000000
1         1e+06
2             a

答案 1 :(得分:2)

    带参数pd.to_numeric
  • errors='coerce'
  • dropna + update

使用@ jezrael的数据框

energy = pd.DataFrame({'Energy Supply':[10, 1.0,'a']})

energy.update(pd.to_numeric(energy['Energy Supply'], 'coerce').mul(1e6).dropna())
energy

  Energy Supply
0         1e+07
1         1e+06
2             a

答案 2 :(得分:1)

另一种解决方案:

def multiply_if_number(x): # This could be a `lambda`
    return x * 1e6 if type(x) in [int,float] else x

energy['Energy Supply'] = energy['Energy Supply'].apply(multiply_if_number)