Python Pandas: как изменить фрейм данных, конкретную ячейку на новый столбец

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

мне нужно сначала изменить фрейм данных, прежде чем я смогу перейти к следующему этапу.

у меня есть следующий фрейм данных

  ------------------- ----- -------- 
|       name        | age | gender |
 ------------------- ----- -------- 
| country India     |     |        |
| Ali               |  13 | male   |
| Abu               |  12 | male   |
| Acik              |  13 | male   |
| country indonesia |     |        |
| natasha           |  15 | female |
| jenny             |  43 | female |
| eric              |  23 | male   |
| country singapore |     |        |
| max               |  23 | male   |
| jason             |  32 | male   |
| jack              |  45 | male   |
 ------------------- ----- -------- 
  

Я хочу так

  --------- ----- -------- ----------- 
|  name   | age | gender |  country  |
 --------- ----- -------- ----------- 
| Ali     |  13 | male   | india     |
| Abu     |  12 | male   | india     |
| Acik    |  13 | male   | india     |
| natasha |  15 | female | indonesia |
| jenny   |  43 | female | indonesia |
| eric    |  23 | male   | indonesia |
| max     |  23 | male   | singapore |
| jason   |  32 | male   | singapore |
| jack    |  45 | male   | singapore |
 --------- ----- -------- ----------- 
  

я не думаю, что pivot / transpose мне поможет, нужно ли мне что-то делать, если еще?

Ответ №1:

Вы можете использовать str.extract для извлечения названия страны, а затем также использовать его для маскировки допустимых строк:

 countries = df['name'].str.extract('^country (. )')[0]
df['country'] = countries.ffill()

df = df[countries.isna()]
  

Вывод

        name   age  gender    country
1       Ali  13.0    male      India
2       Abu  12.0    male      India
3      Acik  13.0    male      India
5   natasha  15.0  female  indonesia
6     jenny  43.0  female  indonesia
7      eric  23.0    male  indonesia
9       max  23.0    male  singapore
10    jason  32.0    male  singapore
11     jack  45.0    male  singapore
  

Альтернативное решение ::

 (df.assign(country=df["name"].str.extract("^country (. )", expand=False).ffill())
   .dropna()
 )