來看看這裏的一個有用的工具是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
這是作業嗎?不知道我是否應該爲你寫一個算法。 –
不,這不是作業。我在 –