如何在Pandas DataFrame中为列分配可迭代对象?修复字典列NaN问题
问题修复:为DataFrame每行生成现金流字典列
原始数据与需求
你有如下金融股票DataFrame,希望新增cashflows列,每行单元格是基于Characteristic1和Characteristic3生成的现金流字典:
import pandas as pd df = pd.DataFrame( { "stockprice": [100, 103, 240], "Characteristic1": [1, 3, 3], "Characteristic2": [5, 7, 1], "Characteristic3": [1, 4, 6], }, index=["Company A", "Company B", "Company C"], )
错误原因分析
你尝试用assign直接传入Series调用cashflow_series函数时,函数接收的是整个Series而非每行的单个值,无法生成对应每行的字典,最终导致列值全为NaN。
修复方案
方案1:使用apply逐行处理
通过apply指定axis=1,让函数逐行接收每行数据,提取对应特征值生成字典:
def cashflow_series(ch1=1, ch2=2): return {0: ch1, 0.5: ch2, 1: 7, 2: 8, 3: 9} # 新增cashflows列 df['cashflows'] = df.apply(lambda row: cashflow_series(ch1=row['Characteristic1'], ch2=row['Characteristic3']), axis=1)
执行后得到预期结果:
stockprice Characteristic1 Characteristic2 Characteristic3 cashflows Company A 100 1 5 1 {0: 1, 0.5: 1, 1: 7, 2: 8, 3: 9} Company B 103 3 7 4 {0: 3, 0.5: 4, 1: 7, 2: 8, 3: 9} Company C 240 3 1 6 {0: 3, 0.5: 6, 1: 7, 2: 8, 3: 9}
方案2:修改函数支持批量生成字典
如果数据集较大,批量处理效率更高,可修改函数接收Series并通过列表推导式生成每行的字典:
def cashflow_series(ch1_series, ch2_series): return [{0: ch1, 0.5: ch2, 1: 7, 2: 8, 3: 9} for ch1, ch2 in zip(ch1_series, ch2_series)] # 使用assign新增列 df = df.assign(cashflows=cashflow_series(df['Characteristic1'], df['Characteristic3']))
此方法直接基于Series批量生成字典列表,避免逐行循环,性能更优。
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

