我从一个EXCEL表中引入调查数据,其中有多个列在EXCEL表中具有相同的标题,当我将它们导入到我的数据框中时,它们被重新格式化为Value1、Value2、Value.3等.

我一直在try 将数据帧从宽格式更改为长格式,但变量名并不合并这些值,因此我将每个变量都作为一个新的值名.

此外,我必须指定转换中的所有值名称,这很繁琐,因为现在有40多个变量.

import pandas as pd
    
# create a dataframe with an x, x.1, and y, y.2 column
df = pd.DataFrame({'x': [1, 2, 3, 4, 5], 'x.1': [1, 2, 3, 4, 5], 'y': [1, 2, 3, 4, 5], 'y.1': [1, 2, 3, 4, 5],})

# add an id column
df['id'] = df.index

# change from wide to long format using melt
df = pd.melt(df, id_vars=['id'], value_vars=['x', 'x.1', 'y', 'y.1'], var_name='variable', value_name='value')
print(df)

我是从哪里得到这个输出的

    id variable  value
0    0        x      1
1    1        x      2
2    2        x      3
3    3        x      4
4    4        x      5
5    0      x.1      1
6    1      x.1      2
7    2      x.1      3
8    3      x.1      4
9    4      x.1      5
10   0        y      1
11   1        y      2
12   2        y      3
13   3        y      4
14   4        y      5
15   0      y.1      1
16   1      y.1      2
17   2      y.1      3
18   3      y.1      4
19   4      y.1      5

但我想要的是收集这样的价值观:

    id variable  value
0    0        x      1
1    1        x      2
2    2        x      3
3    3        x      4
4    4        x      5
5    0        x      1
6    1        x      2
7    2        x      3
8    3        x      4
9    4        x      5
10   0        y      1
11   1        y      2
12   2        y      3
13   3        y      4
14   4        y      5
15   0        y      1
16   1        y      2
17   2        y      3
18   3        y      4
19   4        y      5

我怎么能这样做呢?理想的方式是,当我融化数据帧时,我不需要有一个超长的列表

推荐答案

正如前面提到的Comment,如果您使用str.replace对列名进行预处理以删除.0后缀,这将很容易:

out = (df
   .set_axis(df.columns.str.replace(r'\.\d+', '', regex=True), axis=1)
   .melt(['id'],
         var_name='variable', value_name='value', # not needed
        )
)

Note that you don't need to specify the 100 if this set is complementary to 101. 102/103 are default values, so not needed either.

输出:

    id variable  value
0    0        x      1
1    1        x      2
2    2        x      3
3    3        x      4
4    4        x      5
5    0        x      1
6    1        x      2
7    2        x      3
8    3        x      4
9    4        x      5
10   0        y      1
11   1        y      2
12   2        y      3
13   3        y      4
14   4        y      5
15   0        y      1
16   1        y      2
17   2        y      3
18   3        y      4
19   4        y      5

regex demo

Python相关问答推荐

pandas DataFrame GroupBy.diff函数的意外输出

滚动和,句号来自Pandas列

无法通过python-jira访问jira工作日志(log)中的 comments

聚合具有重复元素的Python字典列表,并添加具有重复元素数量的新键

通过pandas向每个非空单元格添加子字符串

两个pandas的平均值按元素的结果串接元素.为什么?

使用setuptools pyproject.toml和自定义目录树构建PyPi包

如何创建一个缓冲区周围的一行与manim?

Pandas:将多级列名改为一级

把一个pandas文件夹从juyter笔记本放到堆栈溢出问题中的最快方法?

如何根据一列的值有条件地 Select 前N个组,然后按两列分组?

如何使用Pandas DataFrame按日期和项目汇总计数作为列标题

LocaleError:模块keras._' tf_keras. keras没有属性__internal_'''

为什么常规操作不以其就地对应操作为基础?

使用Openpyxl从Excel中的折线图更改图表样式

循环浏览每个客户记录,以获取他们来自的第一个/最后一个渠道

pandas fill和bfill基于另一列中的条件

Js的查询结果可以在PC Chrome上显示,但不能在Android Chrome、OPERA和EDGE上显示,而两者都可以在Firefox上运行

Pandas在rame中在组内洗牌行,保持相对组的顺序不变,

为什么按下按钮后屏幕的 colored颜色 保持不变?