pandas将DataFrame的几列数据合并成为一列

  • Post category:Python

将 DataFrame 中的几列数据合并成为一列,可以使用 pandas 库中的 melt() 函数实现。

melt() 函数用于将 DataFrame 中宽格式的数据转换为长格式,使数据更容易进行分析和处理。其常用的参数有:

  • id_vars:需要保留的列名或列索引,转换后的新列依然以这些列作为标识符。默认值为 None,表示所有列都需要被保留。
  • value_vars:需要被转换成值的列名或列索引。默认值为 None,表示所有列都需要被转换。
  • var_name:转换后新生成的变量列的列名。默认值为 “variable”。
  • value_name:转换后新生成的值列的列名。默认值为 “value”。

示例 1:

假设有如下的 DataFrame:

import pandas as pd

df = pd.DataFrame({
    'id': [1, 2, 3],
    'name': ['Tom', 'Jerry', 'Alice'],
    'score1': [80, 90, 70],
    'score2': [84, 92, 76],
    'score3': [88, 94, 72]
})

其中,idname 列为标识符,score1score2score3 列为需要被合并的列。

要将 score1score2score3 列合并成一个新的列,并且新列的名称为 scores,则可以使用如下代码:

df_melted = df.melt(id_vars=['id', 'name'], value_vars=['score1', 'score2', 'score3'], var_name='score_type', value_name='score')

id_vars 参数指定了需要保留的列为 idnamevalue_vars 参数指定了需要被合并的列为 score1score2score3var_name 参数指定了生成新列的列名为 score_typevalue_name 参数指定了生成新值列的列名为 score

生成的新 DataFrame 如下所示:

   id    name  score_type  score
0   1     Tom     score1     80
1   2   Jerry     score1     90
2   3   Alice     score1     70
3   1     Tom     score2     84
4   2   Jerry     score2     92
5   3   Alice     score2     76
6   1     Tom     score3     88
7   2   Jerry     score3     94
8   3   Alice     score3     72

新 DataFrame 中,idname 列作为标识符被保留下来,而 score1score2score3 列被合并成了 score_type 列,其对应的值被放在了 score 列中。

示例 2:

假设有如下的 DataFrame:

import pandas as pd

df = pd.DataFrame({
    'id': [1, 2, 3],
    'name': ['Tom', 'Jerry', 'Alice'],
    'city': ['Beijing', 'Shanghai', 'Guangzhou'],
    'gender': ['male', 'male', 'female']
})

其中,idname 列为标识符,citygender 列为需要被合并的列。

要将 citygender 列合并成一个新的列,并且新列的名称为 info,则可以使用如下代码:

df_melted = df.melt(id_vars=['id', 'name'], value_vars=['city', 'gender'], var_name='info_type', value_name='info')

生成的新 DataFrame 如下所示:

   id    name  info_type    info
0   1     Tom       city  Beijing
1   2   Jerry       city  Shanghai
2   3   Alice       city  Guangzhou
3   1     Tom     gender     male
4   2   Jerry     gender     male
5   3   Alice     gender   female

新 DataFrame 中,idname 列作为标识符被保留下来,而 citygender 列被合并成了 info_type 列,其对应的值被放在了 info 列中。