#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()
)