DataFrame添加列的不同方法

409 阅读3分钟

当向 DataFrame 中添加列时,可以使用多种方法。以下是一些常见的方法:

  1. assign 方法assign 方法用于添加新的列到 DataFrame,并返回一个新的 DataFrame。它允许你通过指定列名和计算方式来创建新列。
import pandas as pd

# 使用 assign 方法添加新列
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
df = df.assign(C=lambda x: x['A'] + x['B'])
  1. eval 方法eval 方法允许使用字符串表达式来计算新列,并将结果存储在 DataFrame 中。
# 使用 eval 方法添加新列
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
df.eval('C = A + B', inplace=True)
  1. 直接赋值:你也可以直接使用等号将一个 Pandas Series 赋值给 DataFrame 的新列。
# 直接赋值添加新列
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
df['C'] = df['A'] + df['B']
  1. DataFrame.apply 方法:使用 apply 方法可以应用一个函数到 DataFrame 的每一行或列,然后将结果分配给新列。
# 使用 apply 方法添加新列
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
df['C'] = df.apply(lambda row: row['A'] + row['B'], axis=1)
  1. 使用 numpy、pandas 函数:你还可以使用 NumPy 或 Pandas 提供的函数来计算新列,并将结果赋值给 DataFrame 的新列。
import numpy as np

# 使用 NumPy 函数添加新列
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
df['C'] = np.sqrt(df['A'] ** 2 + df['B'] ** 2)

当需要同时添加多列时,通常用assign(),eval()等方法一步实现:

当要一步添加多列到 DataFrame 时,可以使用 assign()eval()、直接赋值等方法。下面是这些方法的全面列举:

  1. 使用 assign() 方法同时添加多列:
df = df.assign(
    New_Column_1 = calculation_1,
    New_Column_2 = calculation_2,
    ...
)
  1. 使用 eval() 方法同时添加多列:
df.eval("""
    New_Column_1 = calculation_1,
    New_Column_2 = calculation_2,
    ...
""", inplace=True)
  1. 直接赋值方式添加多列:
df['New_Column_1'] = calculation_1
df['New_Column_2'] = calculation_2
...
  1. 使用字典一次性赋值多列:
new_columns = {
    'New_Column_1': calculation_1,
    'New_Column_2': calculation_2,
    ...
}
for col, func in new_columns.items():
    df[col] = func

assign()eval()是Pandas中用于添加列的两种方法,它们各自有优点和缺点。

assign()的优点:

  1. 直观易懂: assign()方法接受关键字参数,每个参数都是一个新列的名称和对应的计算公式,这使得代码的意图更加清晰和直观。
  2. 灵活性: 可以方便地使用Python的任何可调用对象作为计算公式,包括函数、lambda函数等。
  3. 链式操作: 可以通过链式调用assign()方法来一次性添加多个列,使代码更加简洁。

assign()的缺点:

  1. 无法直接引用已有列: 在计算新列时,无法直接引用已有的列,需要通过DataFrame的索引方式(例如df['column'])来引用。
  2. 性能较差: 当需要进行大量计算时,assign()方法可能会比较慢,因为它在内部会创建临时DataFrame。

eval()的优点:

  1. 性能优化: eval()方法利用了Pandas内部的一些优化机制,可以在一定程度上提高计算效率,尤其是对于较大的数据集。
  2. 支持引用列: 在计算新列时,可以直接引用已有的列,无需使用DataFrame的索引方式。

eval()的缺点:

  1. 限制较多: 由于eval()要求计算表达式必须是字符串形式,因此有一些计算无法直接在eval()中进行,特别是对于复杂的计算逻辑。
  2. 不够灵活: 相比于assign()eval()对计算公式的灵活性较差,无法直接使用Python的函数或lambda函数进行计算。

综上所述,如果您的计算逻辑比较简单且需要高性能,可以考虑使用eval()方法;如果您需要更灵活的计算方式,并且可读性更重要,那么assign()方法可能更适合您的需求。