[英]pandas convert dataframe to pivot_table where index is the sorting values
我有以下 dataframe:
site height_id height_meters
0 9 c3 24
1 9 c2 30
2 9 c1 36
3 3 c0 18
4 3 bf 24
5 3 be 30
6 4 10 18
7 4 0f 24
8 4 0e 30
我想將其轉換為以下列索引是“站點”的值,值是“height_meters”,我希望它按值的順序進行索引(我查看了 inte.net 並沒有找到類似的東西...嘗試 groupby 並制作一些 pivot 表但沒有成功):
9 3 4
0 24 18 18
1 30 24 24
2 36 30 24
數字之間的差距是不必要的......這是df
my_df = pd.DataFrame(dict(
site=[9, 9, 9, 3, 3, 3, 4, 4, 4],
height_id='c3,c2,c1,c0,bf,be,10,0f,0e'.split(','),
height_meters=[24, 30, 36, 18, 24, 30, 18, 24, 30]
))
您可以使用GroupBy.cumcount
作為列site
的計數器:
print (my_df.groupby('site').cumcount())
0 0
1 1
2 2
3 0
4 1
5 2
6 0
7 1
8 2
dtype: int64
您可以將其轉換為帶有site
列的index
並通過Series.unstack
重塑:
df = my_df.set_index([my_df.groupby('site').cumcount(), 'site'])['height_meters'].unstack()
print (df)
site 3 4 9
0 18 18 24
1 24 24 30
2 30 30 36
DataFrame.pivot
和由cumcount
創建的列的類似解決方案:
df = my_df.assign(new=my_df.groupby('site').cumcount()).pivot('new','site','height_meters')
print (df)
site 3 4 9
new
0 18 18 24
1 24 24 30
2 30 30 36
如果順序很重要,請按列site
的唯一值添加DataFrame.reindex
:
df = (my_df.set_index([my_df.groupby('site').cumcount(), 'site'])['height_meters']
.unstack()
.reindex(my_df['site'].unique(), axis=1))
print (df)
site 9 3 4
0 24 18 18
1 30 24 24
2 36 30 30
最后刪除site
( new
)列和索引名稱可以使用DataFrame.rename_axis
:
df = df.rename_axis(index=None, columns=None)
print (df)
3 4 9
0 18 18 24
1 24 24 30
2 30 30 36
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.