Pandas - разделить столбцы со значениями по умолчанию, если разделитель отсутствует - PullRequest
2 голосов
/ 20 июня 2020

У меня ниже фрейм данных, и я пытаюсь разделить столбец name на first_name и last_name на основе пробела, однако для некоторых имен нет разделителя, и в таких случаях я хочу взять значение в фамилии и оставить пустое в имени.

Один из возможных способов - перебрать все строки и использовать условие if-else для каждой строки, однако, как указано в этом сообщении .

«Итерация в Pandas - это анти-шаблон, и вы должны делать это только тогда, когда исчерпали все остальные варианты». поэтому я ищу способ добиться этого в Pandas.

names_df = pd.read_csv(io.BytesIO(obj['Body'].read()))
print(names_df)
names_df[['first_name', 'last_name']] = names_df['name'].str.split(' ', expand=True)
print(names_df)
ValueError: Columns must be same length as key
order_id      name        product_id  product_price
    0        Thanos         Ipad        800
    1        Hulk           AC          400
    2        C America      Ipad        760
    3        Black Panther  IPhone      1100

Ожидаемый фрейм данных:

first_name   last_name   
              Thanos
              Hulk
   C          America
  Black       Panther

Ответы [ 3 ]

2 голосов
/ 20 июня 2020

Вот решение, которое я смог придумать, не уверен, является ли оно наиболее оптимальным, но оно работает

df = pd.DataFrame({'name': ['Thanos', 'Hulk', 'Black Panther', 'C Amarica']})                                    

def split_name(name): 
    split_name = name.split(' ') 
    return split_name if len(split_name) == 2 else ['', split_name[0]]

pd.DataFrame(df.name.apply(split_name).tolist(), columns=['first_name', 'last_name'])

  first_name last_name
0               Thanos
1                 Hulk
2      Black   Panther
3          C   Amarica
1 голос
/ 20 июня 2020

Сначала разделите, а затем переверните внутренний список, используя str[::-1]

df[['last_name','first_name']] = df.name.str.split().str[::-1].apply(pd.Series).fillna('')

df
            name last_name first_name
0         Thanos    Thanos        
1           Hulk      Hulk        
2      C America   America          C
3  Black Panther   Panther      Black


1 голос
/ 20 июня 2020

Используйте, Series.str.extract вместе с именованными группами захвата регулярных выражений, чтобы извлечь имя и фамилию из столбца имени:

df1 = names_df['name'].str.extract(r'(?P<First_Name>\w+)\s(?P<Last_Name>\w+)')
df1['Last_Name'] = df1['Last_Name'].fillna(names_df['name'])
# print(df1)
  First_Name Last_Name
0        NaN    Thanos
1        NaN      Hulk
2          C   America
3      Black   Panther
...