创建多列的数据框列

时间:2017-11-22 00:13:19

标签: python-3.x pandas

我有一个包含大量列的数据框,我希望将其合并到更多行和更少列中,它具有与下面示例类似的结构:

| 1_a | 1_b | 1_c | 2_a | 2_b | 2_c |  d  |
|-----|-----|-----|-----|-----|-----|-----|
|  1  |  2  |  3  |  1  |  2  |  6  |  z  |
|  2  |  2  |  2  |  3  |  2  |  5  |  z  |
|  3  |  2  |  1  |  4  |  1  |  4  |  z  |

我想将一些行组合起来,如下所示:

| 1 | 2 | letter | d |
|---|---|--------|---|
| 1 | 1 |   a    | z |
| 2 | 3 |   a    | z |
| 3 | 4 |   a    | z |
| 2 | 2 |   b    | z |
| 2 | 2 |   b    | z |
| 2 | 1 |   b    | z |
| 3 | 6 |   c    | z |
| 2 | 5 |   c    | z |
| 1 | 4 |   c    | z |

我创建了一个带有新标题的新数据框,但我不确定如何在追加时将原始标题映射到新标题。

由于

2 个答案:

答案 0 :(得分:3)

尝试

df = df.set_index('d')
df.columns = pd.MultiIndex.from_tuples([tuple(c.split('_')) for c in df.columns])
df = df.stack().reset_index().rename(columns = {'level_1' : 'letter'})

    d   letter  1   2
0   z   a       1   1
1   z   b       2   2
2   z   c       3   6
3   z   a       2   3
4   z   b       2   2
5   z   c       2   5
6   z   a       3   4
7   z   b       2   1
8   z   c       1   4

答案 1 :(得分:0)

在大多数情况下,如果需要动态选择列名,则可能需要编写Python循环。只需手动浏览每个字母,然后将它们连接在一起:

dfs = []
for letter in ('a', 'b', 'c'):
     group = df[['d']]
     group['1'] = df['1_' + letter]
     group['2'] = df['2_' + letter]
     group['letter'] = letter
     dfs.append(group)
result = pd.concat(dfs)