一、添加单列
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()方法等。此外,我们还介绍了如何结合其他函数批量修改列名。掌握了这些知识点,读者可以更加灵活地应对数据处理中的各种情况。