来看看这里的一个有用的工具是pd.DataFrame().stack()
:
df1.stack()
Out[24]:
0 2000 a
2001 a
2002 a
1 2000 b
2001 b
2002 c
2 2000 c
2001 c
2002 d
dtype: object
因为列名排序很好,你可以排序这个,然后使用drop_duplicates()
获得:
df1.stack().sort_index(level=1).drop_duplicates()
Out[26]:
0 2000 a
1 2000 b
2 2000 c
2002 d
dtype: object
或
df1.stack().sort_index(level=1).drop_duplicates(keep='last')
Out[28]:
1 2001 b
0 2002 a
1 2002 c
2 2002 d
dtype: object
要转换这些逐年给予年由价值指数,而不是值,你可以添加.reset_index().set_index(0)['level_1']
到以下任一:
start = df1.stack().sort_index(level=1).drop_duplicates().reset_index().set_index(0)['level_1']
start
Out[31]:
0
a 2000
b 2000
c 2000
d 2002
Name: level_1, dtype: object
也这样对其他之后,将其称为end
,则可以在由列构造的字典上使用pd.Series().map()
,以获取第一个值不出现的名称,而不是最后一个字段的名称。
cols = df1.columns.tolist()+[np.nan]
next_col = {cols[i]:cols[i+1] for i in range(len(cols)-1)}
end = end.map(next_col)
end
Out[36]:
0
b 2002
a NaN
c NaN
d NaN
Name: level_1, dtype: object
为了然后结合这些创造df2
,您可以使用pd.concat
:
df2 = pd.concat([start, end], axis=1).T.reset_index(drop=True)
df2
Out[40]:
a b c d
0 2000 2000 2000 2002
1 NaN 2002 NaN NaN
来源
2017-06-19 13:49:13
EFT
您有解决方案的尝试吗? – EFT
这是作业吗?不知道我是否应该为你写一个算法。 –
不,这不是作业。我在 –