如何用Pandas对齐DataFrame两列列表长度并填充None值?
解决Pandas DataFrame两列列表按行填充至等长的问题
Pandas没有直接内置的函数能完成这个需求,但可以通过自定义逻辑结合apply方法快速实现,以下是具体方案:
1. 自定义填充函数
先编写一个处理单行数据的函数,对比当前行两列列表的长度,将较短的列表用None填充至与较长列表相同的长度:
def pad_row_lists(row): addr_len = len(row["address"]) id_len = len(row["house_id"]) target_len = max(addr_len, id_len) # 填充address列 row["address"] = row["address"] + [None] * (target_len - addr_len) # 填充house_id列 row["house_id"] = row["house_id"] + [None] * (target_len - id_len) return row
2. 应用函数到整个DataFrame
使用apply方法将上述函数作用于每一行(axis=1表示按行处理):
import pandas as pd # 输入DataFrame df = pd.DataFrame( { "address": [['123 Road', '456 Road'], ['789 Road'], ['962 Road', '875 Road', '777 Road']], "house_id": [['123', '456'], ['789', '987'], ['962']] } ) # 执行填充 result_df = df.apply(pad_row_lists, axis=1)
3. 验证结果
处理后的result_df与你期望的输出完全一致:
print(result_df) # 输出: # address house_id # 0 [123 Road, 456 Road] [123, 456] # 1 [789 Road, None] [789, 987] # 2 [962 Road, 875 Road, 777 Road] [962, None, None]
大数据量优化方案
如果你的DataFrame行数较多,apply的效率可能不足,可以提前计算所有行的目标长度,再批量填充:
# 先计算每行的最大长度 max_lengths = df.apply(lambda x: max(len(x["address"]), len(x["house_id"])), axis=1) # 批量填充address列 df["address"] = df.apply( lambda x: x["address"] + [None] * (max_lengths[x.name] - len(x["address"])), axis=1 ) # 批量填充house_id列 df["house_id"] = df.apply( lambda x: x["house_id"] + [None] * (max_lengths[x.name] - len(x["house_id"])), axis=1 )
这种方式避免了在单行处理中重复计算最大长度,能小幅提升处理效率。
内容的提问来源于stack exchange,提问作者amnesic
相关产品推荐
相关产品推荐

