如何为Pandas DataFrame添加长度不同的列?无需循环实现
高效实现Pandas按共同列匹配添加新列(无需循环)
当然有比循环高效得多的实现方式!Pandas内置了一系列向量化操作的函数,完全可以轻松搞定这个需求,代码简洁还跑得快,尤其适合处理大规模数据。
先还原示例中的数据:
import pandas as pd # 主DataFrame main_df = pd.DataFrame({ 'index_column': [1, 2, 3, 4], 'date': [1, 2, 3, 4], 'value': ['A', 'B', 'C', 'D'] }) # 待添加的新列数据 new_data = pd.DataFrame({ 'date': [2, 3], 'value': ['G', 'J'] })
方法一:用reindex快速匹配填充
这是最简洁的方式,核心思路是把新数据转换成以date为索引的Series,再用主DataFrame的date列重新索引,缺失值直接填充0:
# 将新数据转为以date为索引的Series new_value_series = new_data.set_index('date')['value'] # 匹配主df的date列,缺失值填0,添加为新列 main_df['new value'] = new_value_series.reindex(main_df['date'], fill_value=0)
执行后就能得到你期望的结果:
| index_column | date | value | new value |
|---|---|---|---|
| 1 | 1 | A | 0 |
| 2 | 2 | B | G |
| 3 | 3 | C | J |
| 4 | 4 | D | 0 |
方法二:用merge左连接+填充缺失值
如果你更习惯用合并的思路,也可以用左连接实现,之后把缺失的匹配值填充为0:
# 左连接主df和新数据,基于date列,区分重复列名 merged_result = pd.merge( main_df, new_data, on='date', how='left', suffixes=('', '_new') # 给新数据的value列加后缀 ) # 填充缺失值为0,并重命名新列 merged_result['new value'] = merged_result['value_new'].fillna(0) # 移除临时生成的value_new列 merged_result = merged_result.drop('value_new', axis=1)
为什么这两种方法比循环好?
Pandas的这些内置函数都是向量化操作,底层用C语言实现,比Python循环快几个数量级——数据量越大,优势越明显。而且代码可读性更强,维护起来也更方便。
内容的提问来源于stack exchange,提问作者Rolf12
相关产品推荐
相关产品推荐

