首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建df,该df保存另一个dataframe的列名和相应的值。

创建df,该df保存另一个dataframe的列名和相应的值。
EN

Stack Overflow用户
提问于 2018-10-02 13:54:19
回答 2查看 197关注 0票数 4

我创建了以下名为df的数据

代码语言:javascript
复制
       col1  col2  col3
    0     4     5     2
    1     5     2     4
    2     3    10     3
    3     6     2     2
    4     3     2     4 

我现在想要的是翻转行,使df看起来如下:

代码语言:javascript
复制
         column_name  value
    0        col1      4
    1        col2      5
    2        col3      2
    3        col1      5
    4        col2      2
    5        col3      4
   ...       ...      ...

我想我需要使用堆栈(),但我不确定如何使用。我试过以下几种方法

代码语言:javascript
复制
df = df.stack().rename_axis(['column_name']).reset_index(name = 'value')

但这将返回以下错误

代码语言:javascript
复制
raise ValueError('Length of names must match number of levels in '
ValueError: Length of names must match number of levels in MultiIndex.

问题:如何对值进行堆栈以获得所需的数据?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-02 13:55:58

在这里,有必要使用带有MultiIndex的reset_index来删除drop=True的第一级

代码语言:javascript
复制
df = (df.stack()
        .reset_index(level=0, drop=True)
        .rename_axis(['column_name'])
        .reset_index(name = 'value'))
print (df)
   column_name  value
0         col1      4
1         col2      5
2         col3      2
3         col1      5
4         col2      2
5         col3      4
6         col1      3
7         col2     10
8         col3      3
9         col1      6
10        col2      2
11        col3      2
12        col1      3
13        col2      2
14        col3      4

另一个解决方案是melt,值的顺序发生了变化:

代码语言:javascript
复制
df = df.melt(var_name='column_name')
print (df)
   column_name  value
0         col1      4
1         col1      5
2         col1      3
3         col1      6
4         col1      3
5         col2      5
6         col2      2
7         col2     10
8         col2      2
9         col2      2
10        col3      2
11        col3      4
12        col3      3
13        col3      2
14        col3      4
票数 6
EN

Stack Overflow用户

发布于 2018-10-02 14:44:23

如果行的顺序不重要,可以直接使用pd.melt

代码语言:javascript
复制
res = pd.melt(df, var_name='column_name')

如果希望按输入行进行排序,可以使用pd.meltreset_index将索引提升到一个系列,然后使用sort_values

代码语言:javascript
复制
res = pd.melt(df.reset_index(), id_vars='index', var_name='column_name')\
        .sort_values('index').drop('index', 1).reset_index(drop=True)

print(res)

   column_name  value
0         col1      4
1         col2      5
2         col3      2
3         col1      5
4         col2      2
5         col3      4
6         col1      3
7         col2     10
8         col3      3
9         col1      6
10        col2      2
11        col3      2
12        col1      3
13        col2      2
14        col3      4
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52609848

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档