Панды, применяющие функцию к списку столбцов, вызывают TypeError - PullRequest
0 голосов
/ 25 мая 2018

Я пытаюсь очистить несколько столбцов в пандах.У меня есть следующая функция, чтобы очистить его:

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: ("невозможно преобразовать серию в", "произошло в индексах 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

Ответы [ 3 ]

0 голосов
/ 25 мая 2018

Вы можете использовать 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
0 голосов
/ 25 мая 2018

Вам не нужна функция для применения, она занимает гораздо больше времени.Просто используйте встроенный 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
0 голосов
/ 25 мая 2018

applymap с lambda

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...