簡體   English   中英

如何使用 Python 將 CSV 數據從寬格式轉置為長數據集

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

go 的簡單答案是使用pandas.melt() function。

df = df.melt(id_vars=['type', 'rid'], value_vars=['item1', 'item2', 'item3'])

Output: 在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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