如何向 Pandas 数据框添加新列?
有一次面试,面试官突然丢了个问题:“你知道怎么往 Pandas 的 DataFrame 里加新列吗?”我心想,这不是送分题吗?可我还没高兴多久,就看到他递过来一份代码,代码里有点东西不对劲,我差点笑出声……
咱们先来复原下他说的写法:
import pandas as pd
data_info = {
'first': pd.Series([1, 2, 3], index=['a', 'b', 'c']),
'second': pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])
}
df = pd.DataFrame(data_info)
df['third'] = pd.Series([10, 20, 30], index=['a', 'b', 'c'])
df['fourth'] = df['first'] + info['third'] # 这里出问题了
好家伙,info 是哪位?
我第一反应就是:“你这代码能跑起来我直播倒立写Python。”这里明显写错了变量名,info['third'] 根本不存在,正确的应该是 df['third']。
改正后是这样的:
df['fourth'] = df['first'] + df['third']
所以说,写代码和写情书不一样,后者错了可能还能感动对方,前者错一个变量名就直接见红灯。
稍微正经点,我们来聊聊怎么给 DataFrame 加列
作为一个整天和 pandas 打交道的开发,我经常碰到这种场景:原始数据已经有好几列了,我得根据某些逻辑再加点自己的“佐料”。
比如最常见的几种添加新列的方式:
1. 直接赋值一整个 Series(有索引对齐)
df['new_col'] = pd.Series([100, 200, 300], index=['a', 'b', 'c'])
这种方法就像按编号发快递,只要你索引写对了,pandas 会乖乖把值贴到对应的行上,其他行就是 NaN。
2. 用现有列做计算
df['sum_col'] = df['first'] + df['third']
这个逻辑特别适合我们做数据清洗时,比如价格 + 运费,重量 * 数量之类的,简洁明了。
3. 用 apply 搞点灵活操作
df['flag'] = df.apply(lambda row: 'Yes'if row['first'] > 1else'No', axis=1)
这个方法就有点像你写了个迷你函数,逐行处理,虽然慢一点,但胜在灵活,爱怎么搞就怎么搞。
4. 用 assign 也行,链式操作控的最爱
df = df.assign(new_col=df['first'] * 10)
这种方式一般出现在一堆链式调用中,虽然很帅,但有点容易出错,不推荐用在太复杂的逻辑里。
稍微提醒一句:索引对不上,小心 NaN
在给 DataFrame 添加新列的时候,如果你用的 Series 索引不对,比如:
df['bad_col'] = pd.Series([100, 200, 300], index=['x', 'y', 'z'])
你会发现这三行压根没对应的主键,于是全是 NaN。这个时候你以为加了,其实只是丢进去了一堆空气。
所以,我一般的习惯是:要么先 reset_index() 处理好 DataFrame,要么就是明确每一行对应哪个 index,少浪费自己调 bug 的时间。
面试题的最优回答
现在回到最开始那个面试题,如果你是我,你该怎么答呢?
标准答法:
“向 pandas.DataFrame 添加新列有多种方式,最常见的是直接赋值,比如:
df['new_col'] = pd.Series([...], index=...)
或者通过已有列计算:
df['new_col'] = df['col1'] + df['col2']
还可以用 apply 做更复杂的逻辑操作,也可以用 assign 进行链式调用。
注意要保证新列的索引和 DataFrame 对齐,否则会产生 NaN。”
加点分的答法:
“如果你要处理的逻辑复杂,比如涉及判断或多列组合,建议用 apply,比如:
df['label'] = df.apply(lambda row: 'high'if row['score'] > 90else'low', axis=1)
不过性能上比直接向量运算差很多,大数据量推荐 vectorized 方法,像:
df['is_high'] = df['score'] > 90
这个效率高,也更推荐。”
就这回答,稳了,起码比“df['fourth'] = info['third']”靠谱一万倍。
也可以看我写的这篇文章《DeepSeek满血复活,直接起飞!》来进行本地搭建。
对编程、职场感兴趣的同学,大家可以联系我微信:golang404,拉你进入“程序员交流群”。
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》。