将多个索引展平为单个列

时间:2017-11-10 16:07:27

标签: python pandas numpy

假设以下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'])

但它没有得到我想要的结果

4 个答案:

答案 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'])

给出了想要的输出。