簡體   English   中英

將多個索引展平為單個列

[英]Flatten multiple index into a single column

假設以下DataFrame:

     A    B    C    D    E    F
0   d1   10  d11   10  d21   10
1   d2   30  d12   30  d22   30
2   d3   40  d13   40  d23   40
3   d4  105  d14  105  d24  105
4   d5   10  d15   10  d25   10
5   d6   30  d16   30  d26   30
6   d7   40  d17   40  d27   40
7   d8   10  d18   10  d28   10
8   d9    5  d19    5  d29    5
9  d10   10  d20   10  d30   10

如何將所有描述合並到與各自值關聯的單個列中?

   description  value
0           d1     10
1           d2     30
2           d3     40
3           d4    105
4           d5     10
5           d6     30
6           d7     40
7           d8     10
8           d9      5
9          d10     10
10         d11     10
11         d12     30
12         d13     40
13         d14    105
14         d15     10
15         d16     30
16         d17     40
17         d18     10
18         d19      5
19         d20     10
20         d21     10
21         d22     30
22         d23     40
23         d24    105
24         d25     10
25         d26     30
26         d27     40
27         d28     10
28         d29      5
29         d30     10

請注意,原始數據幀的某些描述可能具有空白值和描述

我努力了

pd.melt( id_vars=['A','C','E'], value_vars=['B','D','F'])

但是沒有得到我想要的結果

可以先通過選擇對和解除配對柱iloc ,創建由numpy的陣列values ,轉置和通過壓平ravel

a = df.iloc[:, ::2].values.T.ravel()
b = df.iloc[:, 1::2].values.T.ravel()

或者,如果需要按列名稱選擇值:

a = df[['A','C','E']].values.T.ravel()
b = df[['B','D','F']].values.T.ravel()

最后使用DataFrame構造函數:

df = pd.DataFrame({'description': a, 'value':b})
print (df.head(10))
  description  value
0          d1     10
1          d2     30
2          d3     40
3          d4    105
4          d5     10
5          d6     30
6          d7     40
7          d8     10
8          d9      5
9         d10     10

請注意此工作以獲取示例數據。

pd.DataFrame({'v1':sum(df.select_dtypes(include=['object']).values.tolist(),[]),
              'v2':sum(df.select_dtypes(exclude=['object']).values.tolist(),[])})

Out[255]: 
     v1   v2
0    d1   10
1   d11   10
2   d21   10
3    d2   30
4   d12   30
5   d22   30
6    d3   40
7   d13   40
8   d23   40
9    d4  105

嘗試使用concat

df_new = pd.DataFrame()
df_new['description']= pd.concat([df['A'], df['C'], df['E']], ignore_index=True)
df_new['value']= pd.concat([df['B'], df['D'], df['F']], ignore_index=True)

    description value
0   d1  10
1   d2  30
2   d3  40
3   d4  105
4   d5  10
5   d6  30
6   d7  40
7   d8  10
8   d9  5
9   d10 10
10  d11 10
11  d12 30
12  d13 40
13  d14 105
14  d15 10
15  d16 30
16  d17 40
17  d18 10
18  d19 5
19  d20 10
20  d21 10
21  d22 30
22  d23 40
23  d24 105
24  d25 10
25  d26 30
26  d27 40
27  d28 10
28  d29 5
29  d30 10

僅查看形狀,就可以重新排列3個塊:

pd.DataFrame(np.vstack(np.split(df.values,3,axis=1)),columns=['desc','value'])

給出所需的輸出。

暫無
暫無

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

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