趋近智
通常,你加载的原始数据不包含分析所需的所有信息。你可能需要根据现有数据计算新值或添加分类标签。Pandas 让向 DataFrame 添加新列变得简单。
添加新列最直接的方法是向尚不存在的列名赋值数据。可以把它想象成向字典添加新条目,但其中的“值”通常是 Series、数组,或一个会被广播到所有行的单个值。
让我们从一个简单的 DataFrame 开始:
import pandas as pd
import numpy as np
data = {'col_A': [10, 20, 30, 40],
'col_B': [5, 15, 25, 35]}
df = pd.DataFrame(data)
print("Original DataFrame:")
print(df)
原始 DataFrame:
col_A col_B
0 10 5
1 20 15
2 30 25
3 40 35
如果你想添加一个新列,其中每一行都具有相同的值(一个标量值),你可以直接赋值它:
# 添加一个名为 'source' 的列,其值为常量字符串
df['source'] = 'dataset_1'
# 添加一个名为 'version' 的列,其值为常量数字
df['version'] = 1.0
print("\nDataFrame after adding constant columns:")
print(df)
添加常量列后的 DataFrame:
col_A col_B source version
0 10 5 dataset_1 1.0
1 20 15 dataset_1 1.0
2 30 25 dataset_1 1.0
3 40 35 dataset_1 1.0
Pandas 自动将单个值 'dataset_1' 和数字 1.0 广播,分别填充新列 'source' 和 'version' 中的所有行。
一种非常常见的操作是根据涉及一个或多个现有列的计算来创建新列。由于 Pandas 操作通常是矢量化的(像 NumPy 一样),你可以高效地执行这些计算。
我们来添加一个列 'col_C',它是 'col_A' 和 'col_B' 的和:
# 通过将 'col_A' 和 'col_B' 相加来创建 'col_C'
df['col_C'] = df['col_A'] + df['col_B']
print("\nDataFrame after adding calculated column 'col_C':")
print(df)
添加计算列 'col_C' 后的 DataFrame:
col_A col_B source version col_C
0 10 5 dataset_1 1.0 15
1 20 15 dataset_1 1.0 35
2 30 25 dataset_1 1.0 55
3 40 35 dataset_1 1.0 75
加法操作是针对每一行进行元素级的。你可以使用任何标准算术运算符(+、-、*、/、%)或 NumPy 等库中更复杂的函数。
例如,我们添加另一个列 'col_D',它是 'col_A' 除以 10 的结果:
# 通过将 'col_A' 除以 10 来创建 'col_D'
df['col_D'] = df['col_A'] / 10
print("\nDataFrame after adding calculated column 'col_D':")
print(df)
添加计算列 'col_D' 后的 DataFrame:
col_A col_B source version col_C col_D
0 10 5 dataset_1 1.0 15 1.0
1 20 15 dataset_1 1.0 35 2.0
2 30 25 dataset_1 1.0 55 3.0
3 40 35 dataset_1 1.0 75 4.0
你也可以通过赋值一个 Python 列表或 NumPy 数组来添加新列。主要要求是列表或数组的长度必须与 DataFrame 中的行数(其索引长度)匹配。
# 使用 Python 列表添加列 'col_E'
new_values_list = [100, 200, 300, 400]
df['col_E'] = new_values_list
# 使用 NumPy 数组添加列 'col_F'
new_values_np = np.array([0.1, 0.2, 0.3, 0.4])
df['col_F'] = new_values_np
print("\nDataFrame after adding columns from list and NumPy array:")
print(df)
从列表和 NumPy 数组添加列后的 DataFrame:
col_A col_B source version col_C col_D col_E col_F
0 10 5 dataset_1 1.0 15 1.0 100 0.1
1 20 15 dataset_1 1.0 35 2.0 200 0.2
2 30 25 dataset_1 1.0 55 3.0 300 0.3
3 40 35 dataset_1 1.0 75 4.0 400 0.4
如果长度不匹配,Pandas 将引发 ValueError。
你也可以赋值一个现有的 Pandas Series 来创建新列。这样做时,Pandas 会根据 Series 和 DataFrame 的 索引 来对齐数据。如果索引匹配,值会相应地放置。如果索引不完全对齐,DataFrame 中没有在 Series 中找到匹配索引的行,在新列中将获得一个缺失值 (NaN)。
我们来创建一个索引稍有不同的 Series:
s = pd.Series([500, 600, 700], index=[1, 2, 4]) # 注意索引:1, 2, 4
print("\nSeries 's' to be added:")
print(s)
# 使用 Series 's' 添加 'col_G'
df['col_G'] = s
print("\nDataFrame after adding column 'col_G' from Series 's':")
print(df)
要添加的 Series 's':
1 500
2 600
4 700
dtype: int64
从 Series 's' 添加列 'col_G' 后的 DataFrame:
col_A col_B source version col_C col_D col_E col_F col_G
0 10 5 dataset_1 1.0 15 1.0 100 0.1 NaN
1 20 15 dataset_1 1.0 35 2.0 200 0.2 500.0
2 30 25 dataset_1 1.0 55 3.0 300 0.3 600.0
3 40 35 dataset_1 1.0 75 4.0 400 0.4 NaN
请注意,col_G 仅在索引 1 和 2 处有值,与 Series s 匹配。DataFrame 中的索引 0 和 3 在 s 中不存在,因此它们获得了 NaN。s 中索引 4 的值被忽略了,因为 DataFrame 没有索引 4。这种索引对齐行为是 Pandas 的一个基本特点,可以避免数据错位导致的错误。
能够添加新列,特别是派生列,是数据准备中的重要一步。它让你能够构建新特征、规范化数据,或只是更有效地组织信息以进行分析或建模。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造