从pandas dataframe

时间:2017-12-16 12:54:20

标签: python pandas dataframe

如果以不同的方式提出这个问题,我很抱歉,我不知道如何用它来表达我想做的事情。

假设我有一些包含两列值的数据框:

import pandas as pd

data = {'col1':[0.6, 0.8, 0.9, 0.87, 0.69, 0.88],
        'col2':[0.72, 0.91, 0.83, 0.85, 0.96, 0.76]}

df = pd.DataFrame(data)

df
Out[1]: 
   col1  col2
0  0.60  0.72
1  0.80  0.91
2  0.90  0.83
3  0.87  0.85
4  0.69  0.96
5  0.88  0.76

我想取第2列并在第1列下面“追加”它,继续索引从6到11.我还希望创建一个新的“标识符”列,以获得每个数据点所属的列名。如果没有大量意大利面条代码,我最接近的就是:

pd.DataFrame(df.stack()).reset_index()

Out[34]: 
    level_0 level_1     0
0         0    col1  0.60
1         0    col2  0.72
2         1    col1  0.80
3         1    col2  0.91
4         2    col1  0.90
5         2    col2  0.83
6         3    col1  0.87
7         3    col2  0.85
8         4    col1  0.69
9         4    col2  0.96
10        5    col1  0.88
11        5    col2  0.76

我不希望将其标记为“level_0”,“level_1”等,因为我想要使用的是列名。

我确信有一种简单而专业的方法可以实现这一目标,但我对此并不了解。

1 个答案:

答案 0 :(得分:2)

你真的很亲密,没有必要调用DataFrame构造函数。

对于设置列,名称可以MultiIndex重命名df = df.stack().rename_axis(('a', 'b')).reset_index(name='val') print (df) a b val 0 0 col1 0.60 1 0 col2 0.72 2 1 col1 0.80 3 1 col2 0.91 4 2 col1 0.90 5 2 col2 0.83 6 3 col1 0.87 7 3 col2 0.85 8 4 col1 0.69 9 4 col2 0.96 10 5 col1 0.88 11 5 col2 0.76 级别:

a = np.repeat(df.index, len(df.columns))
b = np.tile(df.columns, len(df.index))
c = df.values.ravel()

df = pd.DataFrame(np.column_stack([a,b,c]), columns=['a','b','c'])
print (df)
    a     b     c
0   0  col1   0.6
1   0  col2  0.72
2   1  col1   0.8
3   1  col2  0.91
4   2  col1   0.9
5   2  col2  0.83
6   3  col1  0.87
7   3  col2  0.85
8   4  col1  0.69
9   4  col2  0.96
10  5  col1  0.88
11  5  col2  0.76

Numpy替代方案:

<Contact heading={<Fragment>Get in touch<span id="dot">.</span></Fragment>} />