[英]pandas stacking a dataframe
我有一個數據框,看起來像:
sensorId 1 2 3
9b:f3:55:19:00:4b:12:00 1 7 8
bf:f3:55:19:00:4b:12:00 6 5 9
da:f3:55:19:00:4b:12:00 1 1 2
我想用以下結構重構為數據框:
sensorId y
9b:f3:55:19:00:4b:12:00 1
9b:f3:55:19:00:4b:12:00 7
9b:f3:55:19:00:4b:12:00 8
bf:f3:55:19:00:4b:12:00 6
bf:f3:55:19:00:4b:12:00 5
bf:f3:55:19:00:4b:12:00 9
da:f3:55:19:00:4b:12:00 1
da:f3:55:19:00:4b:12:00 1
da:f3:55:19:00:4b:12:00 2
我嘗試使用df.stack(),但結果並不令人滿意,因為它返回了pd.series:
9b:f3:55:19:00:4b:12:00 1 1
2 7
3 8
bf:f3:55:19:00:4b:12:00 1 6
2 5
3 9
da:f3:55:19:00:4b:12:00 1 1
2 1
3 2
使用double Series.reset_index
第一個用於刪除第二級的MultiIndex
,第二個用於將Series
轉換為DataFrame
:
df = df.stack().reset_index(level=1, drop=True).reset_index(name='y')
print (df)
sensorId y
0 9b:f3:55:19:00:4b:12:00 1
1 9b:f3:55:19:00:4b:12:00 7
2 9b:f3:55:19:00:4b:12:00 8
3 bf:f3:55:19:00:4b:12:00 6
4 bf:f3:55:19:00:4b:12:00 5
5 bf:f3:55:19:00:4b:12:00 9
6 da:f3:55:19:00:4b:12:00 1
7 da:f3:55:19:00:4b:12:00 1
8 da:f3:55:19:00:4b:12:00 2
編輯:
因為df.stack
返回MultiIndex
,這意味着sensorId
不是列,而是索引。
如果sensorId
為column:
df = df.set_index('sensorId').stack().reset_index(level=1, drop=True).reset_index(name='y')
或使用:
df = df.set_index('sensorId').stack().reset_index(name='y').drop('level_1',1)
還有一點對@jezrael的更正(他很好):
df = df.set_index('sensorId').stack().reset_index(level=1, drop=True).reset_index(name='y')
現在:
print(df)
方法是:
sensorId y
0 9b:f3:55:19:00:4b:12:00 1
1 9b:f3:55:19:00:4b:12:00 7
2 9b:f3:55:19:00:4b:12:00 8
3 bf:f3:55:19:00:4b:12:00 6
4 bf:f3:55:19:00:4b:12:00 5
5 bf:f3:55:19:00:4b:12:00 9
6 da:f3:55:19:00:4b:12:00 1
7 da:f3:55:19:00:4b:12:00 1
8 da:f3:55:19:00:4b:12:00 2
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.