Pandas неправильно переиндексируется с помощью NaN - PullRequest
4 голосов
/ 02 марта 2020

У меня возникают проблемы при переиндексации фрейма данных pandas после удаления значений NaN.

Я пытаюсь извлечь диктанты в столбце df в другой df, а затем соединить эти значения с исходным df в соответствующем строки.

df = pd.DataFrame({'col1': [1, 2, 3, 4, 5], 
                   'col2': [np.NaN, np.NaN, {'aa': 11, 'bb': 22}, {'aa': 33, 'bb': 44}, {'aa': 55, 'bb': 66}]})
df

    col1 col2
0   1    NaN
1   2    NaN
2   3    {'aa': 11, 'bb': 22}
3   4    {'aa': 33, 'bb': 44}
4   5    {'aa': 55, 'bb': 66}

Желаемый конечный результат:

    col1    aa      bb
0   1       NaN     NaN
1   2       NaN     NaN
2   3       11      22
3   4       33      44
4   5       55      66

Если я передаю col2 в функцию pandas .tolist (), dict не распаковывается.

pd.DataFrame(df['col2'].tolist())

0   NaN
1   NaN
2   {'aa': 11, 'bb': 22}
3   {'aa': 33, 'bb': 44}
4   {'aa': 55, 'bb': 66}

Если я использую dropna (), dict распаковывается, но индекс сбрасывается

pd.DataFrame(df['col2'].dropna().tolist())

    aa  bb
0   11  22
1   33  44
2   55  66

Если я пытаюсь сбросить индекс до исходного df, данные строки появляются в различные позиции индекса.

pd.DataFrame(df['col2'].dropna().tolist()).reindex(df.index)

    aa  bb
0   11.0    22.0
1   33.0    44.0
2   55.0    66.0
3   NaN     NaN
4   NaN     NaN

Данные различаются, и невозможно узнать, сколько значений NaN будет в любой точке столбца.

Любая помощь очень ценится .

Ответы [ 3 ]

3 голосов
/ 02 марта 2020

Используйте Series.to_dict для учета индекса:

df.join(pd.DataFrame(df['col2'].to_dict()).T).drop(columns='col2')
   col1    aa    bb
0     1   NaN   NaN
1     2   NaN   NaN
2     3  11.0  22.0
3     4  33.0  44.0
4     5  55.0  66.0
2 голосов
/ 02 марта 2020

IIU C исправьте ваш код, передав index после dropna

s=df.col2.dropna()
df=df.join(pd.DataFrame(s.tolist(), index=s.index))
df
Out[103]: 
   col1                  col2    aa    bb
0     1                   NaN   NaN   NaN
1     2                   NaN   NaN   NaN
2     3  {'aa': 11, 'bb': 22}  11.0  22.0
3     4  {'aa': 33, 'bb': 44}  33.0  44.0
4     5  {'aa': 55, 'bb': 66}  55.0  66.0
2 голосов
/ 02 марта 2020

Попробуйте: pd.concat([df['col1'], df['col2'].apply(pd.Series)], axis=1)

   col1    aa    bb
0     1   NaN   NaN
1     2   NaN   NaN
2     3  11.0  22.0
3     4  33.0  44.0
4     5  55.0  66.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...