У меня есть фрейм данных, который выглядит следующим образом:
5.29559 NaN 2.38176 NaN 0.51521 NaN 0.04454 0.00000 None None None None None None None None
0 NaN NaN NaN NaN 0 NaN NaN 0 NaN NaN 0 2 None None None
4.32454 NaN 1.77600 NaN 0.04454 NaN 0.00000 None None None None None None None None None
0 NaN NaN NaN NaN 0 NaN NaN 0 NaN NaN 2 None None None None
Я пытаюсь создать фрейм данных, удалив все значения NaN и пытаясь сделать текущий фрейм данных таким:
5.29559 2.38176 0.51521 0.04454 0.00000
0 0 0 0 2
4.32454 1.77600 0.04454 0.00000
0 0 0 2
Может кто-нибудь помочь? Я попробовал метод dropna(), но это не помогло.
Я сделал все, что мог, чтобы сделать заголовок вашего вопроса более конкретным.
Давайте попробуем стекировать, чтобы исключить нанов, затем сбрасывать индекс для каждого уровня и, наконец, снова разбирать стек:
(df.stack()
.groupby(level=0)
.apply(lambda df: df.reset_index(drop=True))
.unstack())
0 1 2 3 4
0 5.29559 2.38176 0.51521 0.04454 0.0
1 0.00000 0.00000 0.00000 0.00000 2.0
2 4.32454 1.77600 0.04454 0.00000 NaN
3 0.00000 0.00000 0.00000 2.00000 NaN
Объяснение:
Во-первых, стек для удаления NaN
df.stack()
0 0 5.29559
2 2.38176
4 0.51521
6 0.04454
7 0.00000
1 0 0.00000
5 0.00000
8 0.00000
11 0.00000
12 2.00000
2 0 4.32454
2 1.77600
4 0.04454
6 0.00000
3 0 0.00000
5 0.00000
8 0.00000
11 2.00000
dtype: float64
Вы заметите, что внутренний уровень индекса не увеличивается монотонно. давайте исправим это с помощью groupby.apply
_.groupby(level=0).apply(lambda df: df.reset_index(drop=True))
0 0 5.29559
1 2.38176
2 0.51521
3 0.04454
4 0.00000
1 0 0.00000
1 0.00000
2 0.00000
3 0.00000
4 2.00000
2 0 4.32454
1 1.77600
2 0.04454
3 0.00000
3 0 0.00000
1 0.00000
2 0.00000
3 2.00000
dtype: float64
теперь мы распаковываем
_.unstack()
0 1 2 3 4
0 5.29559 2.38176 0.51521 0.04454 0.0
1 0.00000 0.00000 0.00000 0.00000 2.0
2 4.32454 1.77600 0.04454 0.00000 NaN
3 0.00000 0.00000 0.00000 2.00000 NaN
Вы можете использовать пользовательскую функцию для удаления нулевых значений из каждой строки:
>>> df.agg(lambda x: pd.Series([v for v in x if pd.notna(v)]), axis=1)
0 1 2 3 4
0 5.29559 2.38176 0.51521 0.04454 0.0
1 0.00000 0.00000 0.00000 0.00000 2.0
2 4.32454 1.77600 0.04454 0.00000 NaN
3 0.00000 0.00000 0.00000 2.00000 NaN
попробуй это :
df = pd.DataFrame(your_table)
df = df.dropna(axis=1)
df = pd.DataFrame(df.values.reshape(-1, 5), columns=['col1', 'col2', 'col3', 'col4', 'col5'])
У метода dropna есть аргументы, которые вы можете найти в его документах либо в Интернете, либо через
help(df.dropna)
. Вы можете использовать их.