панды применяют метод upper () к каждому из двух строковых столбцов отдельно, но не вместе - PullRequest
0 голосов
/ 31 мая 2018

У меня есть простой фрейм данных в этих строках:

    a       b
 0  horse  cat
 1  dog    elephant

работает:

df.loc[:,'a'].apply(lambda x: x.upper())

или

df.loc[:,'b'].apply(lambda x: x.upper())

получает животных в соответствующем столбце с заглавной буквы,Однако выполнение

df.loc[:,'a':'b'].apply(lambda x: x.upper())

или

df.loc[:,['a','b']].apply(lambda x: x.upper())

приводит к «AttributeError: (« Объект «Series» не имеет атрибута «upper» »,« произошел в индексе a ') ».

Очевидно, я хотел бы знать, как это исправить (т. Е. Иметь возможность прописывать оба столбца одновременно).Но я также хотел бы знать, как столбец может иметь атрибут «верхний» сам по себе, но потерять его, когда к нему применяется лямбда как часть нескольких столбцов.

Ответы [ 2 ]

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

Использовать str accessor:

df.loc[:,'a':'b'].apply(lambda x: x.str.upper())

OUtput:

       a         b
0  HORSE       CAT
1    DOG  ELEPHANT

Что здесь происходит?

Хорошо. Давайте сделаем небольшую отладку:

def f(x):
    print(type(x))
    print(type(x[0]))

df.loc[:,'a':'b'].apply(f)

Вывод:

<class 'pandas.core.series.Series'>
<class 'str'>
<class 'pandas.core.series.Series'>
<class 'str'>

Здесь мы используем pd.DataFrame.apply.

В этом случае серия панд передается функции f, поэтому мы можем использовать .strаксессор для вызова строковой функции upper.

Теперь давайте рассмотрим первый случай:

def f(x):
    print(type(x))
    print(type(x[0]))

df.loc[:,'a'].apply(f)

Вывод:

<class 'str'>
<class 'str'>
<class 'str'>
<class 'str'>

Здесь мы используем pd.Series.applyи передать каждое значение само.Поэтому мы можем просто вызывать строковую функцию upper непосредственно для каждого значения.

И вы также можете использовать pd.DataFrame.applymap, так как @ chrisz показывает в его решении, чтобы передать каждое значение ячейки информационного кадра.к функции.

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

Используйте applymap для того, чтобы:

Применить функцию к DataFrame, которая предназначена для поэлементной работы, например, как отображениеfunc, series) для каждой серии в кадре данных

df[['a', 'b']].applymap(lambda x: x.upper())

       a         b
0  HORSE       CAT
1    DOG  ELEPHANT
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...