代码之家  ›  专栏  ›  技术社区  ›  Mike Henderson

更改数据帧中的多列

  •  1
  • Mike Henderson  · 技术社区  · 7 年前

    import numpy as np
    import pandas as pd
    
    def convert(str):
        try:
            return float(str.replace(',', ''))
        except:
            return None
    
    df = pd.DataFrame([
        ['A', '1,234', '456,789'],
        ['B', '1'    , '---'    ]
    ], columns=['Company Name', 'X', 'Y'])
    

    我想改变信仰 X 和 Y 十 和 所以我必须使用整数索引。

    df.iloc[:, 1] = df.iloc[:, 1].apply(convert)
    df.iloc[:, 2] = df.iloc[:, 2].apply(convert)
    

    这并不意味着:

    df.iloc[:, 1:2] = df.iloc[:, 1:2].apply(convert)
    # Error: could not broadcast input array from shape (2) into shape (2,1)
    

    有没有什么办法 convert

    1 回复  |  直到 7 年前
        1
  •  1
  •   jpp    7 年前

    你的逻辑有几个问题:

    1. 切片 1:2 排除 2 ,与列表切片或 slice 1:3
    2. 通过将元素函数应用于序列 pd.Series.apply 作品要将元素函数应用于数据帧,需要 pd.DataFrame.applymap .
    3. 阴影内置:使用 mystr x 而不是 str 作为变量或参数名。
    4. try / except 在这种情况下,通常应该指定错误类型 ValueError .

    def convert(x):
        try:
            return float(x.replace(',', ''))
        except ValueError:
            return None
    
    df.iloc[:, 1:3] = df.iloc[:, 1:3].applymap(convert)
    
    print(df)
    
      Company Name     X       Y
    0            A  1234  456789
    1            B     1     NaN
    

    但是,您的逻辑效率很低:您应该尽可能利用列操作。这可以通过 pd.DataFrame.apply 随着 pd.to_numeric 适用于每个 系列 :

    def convert_series(x):
        return pd.to_numeric(x.str.replace(',', ''), errors='coerce')
    
    df.iloc[:, 1:3] = df.iloc[:, 1:3].apply(convert_series)
    
    print(df)
    
      Company Name     X       Y
    0            A  1234  456789
    1            B     1     NaN