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