假设以下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'])
但它没有得到我想要的结果
答案 0 :(得分:1)
您可以先按iloc
选择配对和非配对列,按values
创建numpy数组,按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
答案 1 :(得分:1)
请注意您的示例数据的这项工作。
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
答案 2 :(得分:1)
尝试使用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 :(得分:0)
只要看一下形状,就有3块可以重新排列:
pd.DataFrame(np.vstack(np.split(df.values,3,axis=1)),columns=['desc','value'])
给出了想要的输出。