Convert dataframe from wide to long - pandas

被刻印的时光 ゝ 提交于 2019-12-23 01:44:05

问题


I have a dataframe like this:

index    S_1 S_2 S_3 S_4
 0        1    0   0   1
 1        1    1  Nan Nan

I am trying to change it from long to wide. Eg.

index num S
 0     1  1
 0     2  0
 0     3  0
 0     4  1
 1     1  1
 1     2  1
 1     3  Nan
 1     4  Nan

I have tried the following code, based on this answer, but I get the following error:

matches_df.columns = matches_df.columns.str.split('_', expand=True)

TypeError: object of type 'float' has no len()

Why am I unable to split on the "_"? There is other information in the columns which I would like to preserve.


回答1:


There is pandas.wide_to_long, which is nice when the columns have stubs like that.

import pandas as pd

df.reset_index(inplace=True,drop=True)
df['id'] = df.index
df = pd.wide_to_long(df, stubnames='S_', i='id', j='num').reset_index().rename(columns={'S_':'S'})

#  id num  index    S
#0   0   1      0  1.0
#1   1   1      1  1.0
#2   0   2      0  0.0
#3   1   2      1  1.0
#4   0   3      0  0.0
#5   1   3      1  NaN
#6   0   4      0  1.0
#7   1   4      1  NaN


来源:https://stackoverflow.com/questions/50087135/convert-dataframe-from-wide-to-long-pandas

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!