Python中如何将部分列转为对数形式并创建新DataFrame
解决Pandas创建含对数列新DataFrame的问题
原数据集
year gnp labor capital 0 1955 114043 8310 182113 1 1956 120410 8529 193745 2 1957 129187 8738 205192 3 1958 134705 8952 215130
错误原因
你之前使用pd.DataFrame('year', 'ln_gnp', ' ln_labor', 'ln_capital')的写法不符合Pandas参数要求——pd.DataFrame()需要接收字典、列表、数组等可迭代结构作为输入,直接传入字符串会导致初始化失败。
正确解决方案
方法1:基于已生成的Series构造字典
如果你已经单独计算出三个对数Series,可通过字典将它们与原year列组合成新DataFrame:
import pandas as pd import numpy as np # 假设原DataFrame命名为df ln_gnp = np.log(df.gnp) ln_labor = np.log(df.labor) ln_capital = np.log(df.capital) # 构造新DataFrame new_df = pd.DataFrame({ 'year': df['year'], 'ln_gnp': ln_gnp, 'ln_labor': ln_labor, 'ln_capital': ln_capital })
方法2:基于原DataFrame直接扩展(更简洁)
无需单独生成Series,直接在原DataFrame上计算对数列,再筛选目标列:
new_df = df.copy() # 添加对数列 new_df['ln_gnp'] = np.log(new_df['gnp']) new_df['ln_labor'] = np.log(new_df['labor']) new_df['ln_capital'] = np.log(new_df['capital']) # 保留需要的列 new_df = new_df[['year', 'ln_gnp', 'ln_labor', 'ln_capital']]
方法3:使用assign批量处理(更优雅)
通过assign方法一次性添加所有对数列,再直接筛选目标列:
new_df = df.assign( ln_gnp=np.log(df['gnp']), ln_labor=np.log(df['labor']), ln_capital=np.log(df['capital']) )[['year', 'ln_gnp', 'ln_labor', 'ln_capital']]
验证结果
运行上述任意方法后,new_df的输出如下:
year ln_gnp ln_labor ln_capital 0 1955 11.645379 9.023866 12.110384 1 1956 11.698230 9.052073 12.173250 2 1957 11.768338 9.078652 12.230624 3 1958 11.809347 9.104045 12.275332
内容的提问来源于stack exchange,提问作者limbalu
相关产品推荐
相关产品推荐

