[英]How to transpose CSV data from a wide format to long dataset using Python
我需要使用 Python 對任意數量的“項目”執行以下數據轉換。前兩列始終相同,然后可能有數千個“itemN”列,我希望所有實數值都在一個新的單列。
我曾嘗試使用 pandas.wide_to_long 但據我所知,我會將新名稱放入轉置表中,如果項目數量可能發生變化,這將不起作用。
type rid item1 item2 item3
apple [81] 1.1 1.1 1.1
orange [82] 2.2 2.2 2.2
banana [41,42,43,52] 3.3 3.3 3.3
kiwi [90,95] 4.4 4.4 4.4
到
type rid gid value
apple [81] item1 1.1
apple [81] item2 1.1
apple [81] item3 1.1
orange [82] item1 2.2
orange [82] item2 2.2
orange [82] item3 2.2
banana [41,42,43,52] item1 3.3
banana [41,42,43,52] item2 3.3
banana [41,42,43,52] item3 3.3
kiwi [90,95] item1 4.4
kiwi [90,95] item2 4.4
kiwi [90,95] item3 4.4
到目前為止,我已經嘗試使用雙 for 循環和索引切片與 numpy arrays 和使用 pandas.wide_to_long。
a = np.array([['apple' ,tuple([81]) ,1.1 ,1.1 ,1.1] ,['orange' ,tuple([82]) ,2.2 ,2.2 ,2.2],['banana' ,tuple([41,42,43,52]) ,3.3 ,3.3 ,3.3],['kiwi' ,tuple([90,95]) ,4.4 ,4.4 ,4.4]])
names = ['type' ,'rid' ,'item1' ,'item2' ,'item3']
df = pd.DataFrame(a,columns=names)
這看起來像是DataFrame.explode
(pandas 0.25+) 的工作。
# Build a DataFrame identical to the first example data you provided
d = {'type': {0: 'apple', 1: 'orange', 2: 'banana', 3: 'kiwi'},
'rid': {0: [81], 1: [82], 2: [41, 42, 43, 52], 3: [90, 95]},
'item1': {0: 1.1, 1: 2.2, 2: 3.3, 3: 4.4},
'item2': {0: 1.1, 1: 2.2, 2: 3.3, 3: 4.4},
'item3': {0: 1.1, 1: 2.2, 2: 3.3, 3: 4.4}})
df = pd.DataFrame(d)
# Explode the 'rid' column and reset to default integer index
df.explode('rid').reset_index(drop=True)
type rid item1 item2 item3
0 apple 81 1.1 1.1 1.1
1 orange 82 2.2 2.2 2.2
2 banana 41 3.3 3.3 3.3
3 banana 42 3.3 3.3 3.3
4 banana 43 3.3 3.3 3.3
5 banana 52 3.3 3.3 3.3
6 kiwi 90 4.4 4.4 4.4
7 kiwi 95 4.4 4.4 4.4
您可以將前 2 列放入索引,堆疊結果 dataframe,然后重置索引:
df.set_index(['type', 'rid']).stack().reset_index()
給出:
type rid level_2 0
0 apple [81] item1 1.1
1 apple [81] item2 1.1
2 apple [81] item3 1.1
3 orange [82] item1 2.2
4 orange [82] item2 2.2
5 orange [82] item3 2.2
6 banana [41,42,43,52] item1 3.3
7 banana [41,42,43,52] item2 3.3
8 banana [41,42,43,52] item3 3.3
9 kiwi [90,95] item1 4.4
10 kiwi [90,95] item2 4.4
11 kiwi [90,95] item3 4.4
只需重命名新列,即可完成:
df.set_index(['type', 'rid']).stack().reset_index().rename(columns={'level_2': 'gid',
0: 'value'})
給出預期的 dataframe。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.