【问题标题】:Pandas applying a function to list of columns raises TypeErrorPandas 将函数应用于列列表会引发 TypeError
【发布时间】:2018-05-25 14:48:31
【问题描述】:

我正在尝试清理 pandas 中的多个列。我有以下功能来清理它:

def convert_dash_comma_into_float(num):
    if " -   " in num:
        num = num.replace(" -   ", "0.0")
    elif "," in num:
    num = num.replace(',', '')
    try:
        return float(num)
    except ValueError:
        return np.nan

当我将此函数应用于单个列时,它可以工作。

df["rpks"].apply(convert_dash_comma_into_float)

但是当我尝试通过提供一个列表来申请一系列列时,因为我有一堆要清理的列,它会引发 TypeError

df[["rpks", 'asks', 'pax']].apply(convert_dash_comma_into_float)

TypeError: ("cannot convert the series to ", 'occurred at index RPKs First')

这是一些当前对象类型为“O”的示例数据:

rpks    asks    pax
9.74    194.72  1,752.48
19.47   82.74   700.85
 -      360.16  3,679.45
127.03  994.14  7,306.93
53.54   612.75  5,770.53
 -      7.02    666.43
34.52   197.28  784.19
 -      460.31  5,466.80
 -      108.63  1,128.90
 -      16.54   913.49
10.52   368.06  3,054.90
93.93   784.55  5,646.55

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    applymaplambda

    df[['rpks', 'asks', 'pax']].applymap(lambda r: '0.0' if '-' in str(r) else str(r).replace(',', ''))
    
          rpks    asks      pax
    0     9.74  194.72  1752.48
    1    19.47   82.74   700.85
    2      0.0  360.16  3679.45
    3   127.03  994.14  7306.93
    4    53.54  612.75  5770.53
    5      0.0    7.02   666.43
    6    34.52  197.28   784.19
    7      0.0  460.31  5466.80
    8      0.0  108.63  1128.90
    9      0.0   16.54   913.49
    10   10.52  368.06  3054.90
    11   93.93  784.55  5646.55
    

    【讨论】:

    • 嗨,它有效。但究竟为什么呢?为什么 lambda 函数在这种情况下有效,但不是我定义的那个?感谢您对此进行调查。
    • 您的函数似乎没问题,除了某些列是浮点数,因此在浮点数上使用 in 会导致错误。还使用applyapplymap
    【解决方案2】:

    你可以在你的函数中使用pd.DataFrame.applymap

    但是,我建议您重构您的逻辑以首先检查float,因为如果您的数据具有代表性,那么许多值已经是可接受的格式。

    这是一个例子。

    def converter(num):
        try:
            return float(num)
        except ValueError:
            try:
                num = num.replace('-', '0.0').replace(',', '')
                return float(num)
            except ValueError:
                return np.nan
    
    cols = ['rpks', 'asks', 'pax']
    df[cols] = df[cols].applymap(converter)
    
    print(df)
    
          rpks    asks      pax
    0     9.74  194.72  1752.48
    1    19.47   82.74   700.85
    2     0.00  360.16  3679.45
    3   127.03  994.14  7306.93
    4    53.54  612.75  5770.53
    5     0.00    7.02   666.43
    6    34.52  197.28   784.19
    7     0.00  460.31  5466.80
    8     0.00  108.63  1128.90
    9     0.00   16.54   913.49
    10   10.52  368.06  3054.90
    11   93.93  784.55  5646.55
    

    【讨论】:

    • 这很好。正如您所指出的,我发现解决方案是使用 applymap 。非常感谢。
    【解决方案3】:

    你不需要在这里应用一个函数,它会消耗更多的时间。只需使用内置的replace,速度很快,也可以将字典作为参数,即

    df = df.replace({'-':0.0,',':''},regex=True)
    
        rpks    asks      pax
    0     9.74  194.72  1752.48
    1    19.47   82.74   700.85
    2        0  360.16  3679.45
    3   127.03  994.14  7306.93
    4    53.54  612.75  5770.53
    5        0    7.02   666.43
    6    34.52  197.28   784.19
    7        0  460.31  5466.80
    8        0  108.63  1128.90
    9        0   16.54   913.49
    10   10.52  368.06  3054.90
    11   93.93  784.55  5646.55
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多