#python #pandas #numpy #dataframe
#python #pandas #numpy #dataframe
Вопрос:
У меня есть такой фрейм данных,
df_nba = pd.DataFrame({'col1': ['name', 'season',np.nan,'points','position','pages',
'name', 'season',np.nan,'points','position','pages',
'name', 'season',np.nan,'points','position','pages',
'name', 'season',np.nan,'points','position','pages',
'name', 'season',np.nan,'points','pages',
'name', 'season',np.nan,'points','position','pages',
'name', 'season',np.nan,'points','position','pages',
'name', 'season',np.nan,'pages'
],
'col2': ['kobe', np.nan,'96-97',7.6,'SF',1,
'kobe', np.nan,'97-98',15.4,'SF',2,
'kobe', np.nan,'98-99',19.9,'SG',3,
'kobe', np.nan,'99-00',22.5,'SG',4,
'lebron', np.nan,'03-04',20.9,5,
'lebron', np.nan,'04-05',27.2,'SF',6,
'lebron', np.nan,'05-06',31.4,'SF',7,
'lebron', np.nan,'06-07',8
]})
col1 — это имя переменной, а col2 — значение, соответствующее левой стороне.
col1 col2
0 name kobe
1 season NaN
2 NaN 96-97
3 points 7.6
4 position SF
5 pages 1
6 name kobe
7 season NaN
8 NaN 97-98
9 points 15.4
10 position SF
11 pages 2
12 name kobe
13 season NaN
14 NaN 98-99
15 points 19.9
16 position SG
17 pages 3
18 name kobe
19 season NaN
20 NaN 99-00
21 points 22.5
22 position SG
23 pages 4
24 name lebron
25 season NaN
26 NaN 03-04
27 points 20.9
28 pages 5
29 name lebron
30 season NaN
31 NaN 04-05
32 points 27.2
33 position SF
34 pages 6
35 name lebron
36 season NaN
37 NaN 05-06
38 points 31.4
39 position SF
40 pages 7
41 name lebron
42 season NaN
43 NaN 06-07
44 pages 8
Могу ли я получить данные, перенеся имя переменной в разные столбцы? Вывод будет выглядеть,
Page name season points position
1 kobe 96-97 7.6 SF
2 kobe 97-98 15.4 SF
3 kobe 98-99 19.9 SG
4 kobe 99-00 22.5 SG
5 lebron 03-04 20.9 NaN
6 lebron 04-05 27.2 SF
7 lebron 05-06 31.4 SF
8 lebron 06-07 NaN NaN
Я пробовал использовать группировку по страницам для перестановки фрейма данных,
df_new = pd.DataFrame(
df_nba.groupby((df_nba['col1'] == 'pages').cumsum())['col2'].agg(list).to_list(),
columns=['name', 'xxx', 'season', 'points', 'position','page'] ).drop(columns='xxx')
Но, похоже, вывод неверен. Я не знаю, как обработать недостающие данные на стр. 5 и стр. 8. Потому что в исходном наборе данных отсутствуют не только отсутствующие значения, но и имя переменной.
Ответ №1:
Проверьте sorted
cumcount
затем pivot
df = df.apply(lambda x : sorted(x,key=pd.notnull)).dropna()
df['New'] = df.groupby('col1').cumcount()
out = df.pivot(index = 'New', columns = 'col1', values = 'col2')
Out[148]:
col1 name pages points position season
New
0 kobe 1 7.6 SF 96-97
1 kobe 2 15.4 SF 97-98
2 kobe 3 19.9 SG 98-99
3 kobe 4 22.5 SG 99-00
4 lebron 5 20.9 SF 03-04
5 lebron 6 27.2 SF 04-05
6 lebron 7 31.4 NaN 05-06
7 lebron 8 NaN NaN 06-07
Комментарии:
1. Это здорово! Просто пытаюсь понять.. как «сортировка» работает в этом контексте? Я полностью пытаюсь понять результаты
df.apply(lambda x : sorted(x,key=pd.notnull))
2. @sharathnatraj сортировать значение по равно нулю или нет без учета индекса строки
3. Хороший вариант
sorted
. Также аналогичный подходdf_nba = df_nba.apply(lambda x: x.dropna().values)
4. Привет, BEN_YO. Спасибо за ответ! Я обнаружил, что здесь есть небольшая проблема. В исходном наборе данных нет
position
forlebron
at03-04
season . Но ответ показывает отсутствие в05-06
сезон. Вы знаете, как это исправить?
Ответ №2:
Я буду использовать df.pivot()
и reset_index:
df.pivot(columns='col1',values='col2').reset_index()