您的位置:

DataFrame添加列的多个方面详解

一、添加单列

1、使用赋值语句添加新列

在pandas中,可以使用赋值语句为DataFrame添加新列。例如,创建一个包含“name”和“age”两列的DataFrame:


import pandas as pd
df = pd.DataFrame({'name': ['Alice', 'Bob', 'Charlie'], 'age': [25, 30, 35]})

现在,我们想要添加一个新列“gender”。可以直接用赋值语句为df添加新列:


df['gender'] = ['F', 'M', 'M']
print(df)

输出结果为:

      name  age gender
0    Alice   25      F
1      Bob   30      M
2  Charlie   35      M

2、使用insert()方法添加新列

另外一种添加新列的方式是使用pandas.DataFrame.insert()方法。该方法允许在DataFrame的指定位置插入一个新的列。例如,在上面的例子中,我们可以在“age”列后面插入一个新的名为“gender”的列:


df.insert(2, 'gender', ['F', 'M', 'M'])
print(df)

输出结果与前面的示例代码相同。

二、添加多列

1、使用赋值语句添加多列

对于需要添加多列的情况,使用赋值语句也很方便。例如,现在我们希望在之前的DataFrame上同时添加“height”和“weight”两列。


df['height'] = [165, 175, 180]
df['weight'] = [50, 70, 85]
print(df)

输出结果如下:

      name  age gender  height  weight
0    Alice   25      F     165      50
1      Bob   30      M     175      70
2  Charlie   35      M     180      85

2、使用concat()方法添加多列

pandas提供了一个名为“concat”的函数,可以沿着指定的轴连接多个DataFrame或Series对象。


df_height = pd.DataFrame([165, 175, 180], columns=['height'])
df_weight = pd.DataFrame([50, 70, 85], columns=['weight'])

df = pd.concat([df, df_height, df_weight], axis=1)
print(df)

注意,在使用concat()方法连接时,需要指定axis=1,表示沿着列的方向连接。如果指定axis=0,则表示沿着行方向连接。

三、利用apply()方法添加新列

1、使用apply()方法根据行数据生成新列

apply()方法可以接受一个函数作为参数,该函数将由DataFrame或者Series的每一行数据调用,返回一个值,这个值就会作为新的一列添加到DataFrame或Series中。以下是一个示例:


def calculate_bmi(row):
    height = row['height'] / 100
    weight = row['weight']
    bmi = weight / (height ** 2)
    return round(bmi, 1)

df['bmi'] = df.apply(calculate_bmi, axis=1)
print(df)

输出结果如下:

      name  age gender  height  weight   bmi
0    Alice   25      F     165      50  18.4
1      Bob   30      M     175      70  22.9
2  Charlie   35      M     180      85  26.2

上述代码中,我们定义了一个函数calculate_bmi(),接受DataFrame的每一行作为参数,然后根据“height”和“weight”列计算bmi指数。

2、使用apply()方法根据列数据生成新列

另外一种使用apply()方法添加新列的方式是根据某一列的数据生成新列。例如,现在我们想要在DataFrame上添加一个新的列,表示每个人的性别是否为“Male”,可以按照以下方式实现:


def gender_to_number(gender):
    return 1 if gender == 'M' else 0

df['is_male'] = df['gender'].apply(gender_to_number)
print(df)

输出结果如下:

      name  age gender  height  weight   bmi  is_male
0    Alice   25      F     165      50  18.4        0
1      Bob   30      M     175      70  22.9        1
2  Charlie   35      M     180      85  26.2        1

上述代码中,我们定义了一个函数gender_to_number(),接受“gender”列中的每个值作为参数,如果为“M”则返回1,否则返回0。然后使用apply()方法将该函数应用于“gender”列,生成新的“is_male”列。

四、结合其他函数批量修改列名

在处理一些大型的数据集时,可能需要对列名称进行批量修改。pandas提供了一些方法可以方便地修改列名。

1、使用rename()方法修改列名

rename()方法可以接受一个字典对象,可以将DataFrame的某些列名称修改为指定名称。


df = df.rename(columns={'name': 'Name', 'age': 'Age'})
print(df)

上述代码将“name”列的名称修改为“Name”,将“age”列的名称修改为“Age”。

2、使用map()方法修改列名

map()方法可以接受一个函数作为参数,该函数将对DataFrame的每个列名称进行调用,返回新的列名称。


def add_prefix(col_name):
    return 'PERSON_' + col_name.upper()

df = df.rename(columns=add_prefix)
print(df)

上述代码中,我们定义了一个函数add_prefix(),该函数将DataFrame的每个列名称前面添加“PERSON_”前缀。然后使用rename()方法调用该函数,生成新的列名称。

五、使用assign()方法添加新列

assign()方法可以添加新列到DataFrame中,同时可以进行链式操作。

1、添加单列


df = df.assign(bmi_class=df['bmi'].apply(lambda x: 'Underweight' if x < 18.5 else 'Normal' if x < 25 else 'Overweight'))
print(df)

上述代码中,我们使用assign()方法添加了一个名为“bmi_class”的新列,值为根据“bmi”列计算得出的标准分类结果。

2、添加多列


df = df.assign(
    bmi_class=df['bmi'].apply(lambda x: 'Underweight' if x < 18.5 else 'Normal' if x < 25 else 'Overweight'),
    name_len=df['Name'].apply(lambda x: len(x))
)
print(df)

上述代码中,我们使用assign()方法同时添加了两个新列。

六、结语

在本文中,我们详细阐述了在pandas中如何添加新列到DataFrame中。针对不同场景,我们介绍了多种添加新列的方法,包括使用赋值语句、使用concat()方法、使用apply()方法和使用assign()方法等。此外,我们还介绍了如何结合其他函数批量修改列名。掌握了这些知识点,读者可以更加灵活地应对数据处理中的各种情况。