Python技术迷

如何向 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的入门到精通教程,完全免费:https://www.songshuhezi.com/deepseek

也可以看我写的这篇文章《DeepSeek满血复活,直接起飞!》来进行本地搭建。

对编程、职场感兴趣的同学,大家可以联系我微信:golang404,拉你进入“程序员交流群”。
🔥虎哥私藏精品 热门推荐🔥

虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》。

资料包含了《IDEA视频教程》、《最全python面试题库》、《最全项目实战源码及视频》及《毕业设计系统源码》,总量高达650GB,全部免费领取