簡體   English   中英

pandas 將 dataframe 轉換為數據透視表,其中索引是排序值

[英]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

最后刪除sitenew )列和索引名稱可以使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM