Как перевернуть строки в панде dataframe? - PullRequest
1 голос
/ 22 октября 2019

Мой фрейм данных похож на

ID   col1
1    Michael Owen
2    Stephen Curry
3    Messi, Lionel
4    James, LeBron

Я попытался изменить порядок тех имен, которые были разделены на ", ".

Мой код:

df['col1'] = df.col1.str.split().apply(lambda x: ', '.join(x[::-1]))

Но он переворачивает все строки, даже если имена были разделены на " ".

ID   col1
1    Owen, Michael
2    Curry, Stephen
3    Lionel, Messi
4    LeBron, James

Тогда я попытался

df.loc[df['col1'].str.contains(", ").split("col1")].apply(lambda x: ', '.join(x[::-1]))

Это дает мне ошибку,

AttributeError: 'Series' object has no attribute 'split'

Как я могу решить эту проблему?

Ответы [ 5 ]

3 голосов
/ 22 октября 2019

Чтобы исправить ваш код np.where

df['col1']=np.where(df.col1.str.contains(','),df.col1.str.split(', ').apply(lambda x: ', '.join(x[::-1])),df.col1)
3 голосов
/ 22 октября 2019

Использование Series.where:

df['col1']=( df.col1.str.split()
              .apply(lambda x: ', '.join(x[::-1]).rstrip(','))
              .where(df['col1'].str.contains(','),df['col1']) )

   ID           col1
0   1   Michael Owen
1   2  Stephen Curry
2   3  Lionel, Messi
3   4  LeBron, James

Если вы хотите сбросить ','

df['col1']=( df.col1.str.split()
              .apply(lambda x: ', '.join(x[::-1]).rstrip(','))
              .where(df['col1'].str.contains(','),df['col1']) 
              .str.replace(',','') )

   ID           col1
0   1   Michael Owen
1   2  Stephen Curry
2   3  Lionel  Messi
3   4  LeBron  James
3 голосов
/ 22 октября 2019

Это дает мне ошибку,

Это потому, что str.contains(", ") возвращает логический ряд, и у него нет метода split.

В любом случаепопробуйте

df.col1.str.split(',').str[1] + ',' + df.col1.str.split(',').str[0]
2 голосов
/ 22 октября 2019

Вы просто должны ввести запятую в split(), например, так:

df['col1'] = df.col1.str.split(',').apply(lambda x: ', '.join(x[::-1]))

Если вы хотите повернуть вспять и опустить ',', удалите ее из метода join.

df['col1'] = df.col1.str.split(',').apply(lambda x: ' '.join(x[::-1]))
0 голосов
/ 22 октября 2019

Я решил представить окончательные значения без запятой. Если вам нужна запятая, измените строку join с ' ' на ', '. Я добавил эти ответы, потому что:

  1. Нет необходимости использовать apply для обращения к списку, когда str[::-1] выполняет работу
  2. Нет необходимости использовать apply или любой другой трюк при разбиении на запятую ',' создаст список в любом случае, и обращение списка из одного элемента к тому же списку. Это означает, что мой метод безопасен для работы с именами без запятых. Мне не нужна конструкция if / then.
  3. Я имею дело с потенциальными пробелами двумя разными способами.
    1. С регулярным выражением
    2. С str.strip

Regex и pandas.Series.str ...

... приковано 3 раза

#                          regex expression  
#                          split on comma
#                          followed by zero
#                          or more spaces
#                               /--\
df['col1'] = df.col1.str.split(',\s*').str[::-1].str.join(' ')

df

   ID           col1
0   1   Michael Owen
1   2  Stephen Curry
2   3   Lionel Messi
3   4   LeBron James

понимание и str.strip

df['col1'] = [' '.join([*map(str.strip, x.split(','))][::-1]) for x in df.col1]

df

   ID           col1
0   1   Michael Owen
1   2  Stephen Curry
2   3   Lionel Messi
3   4   LeBron James
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...