Pandas如何向空列表追加纯值 不含索引、name、dtype并创建DataFrame
问题原因
你循环中计算得到的x是pandas Series对象,并非原生数值类型,因此追加到空列表后会自带Series的索引、name、dtype属性,无法得到纯计算值。
快速修复:提取纯值后追加
只需要将每次计算得到的Series中的标量值取出,再追加到列表即可。建议先把循环外固定不变的参数提前提取,避免每次循环重复筛选DataFrame,提升运行效率:
China_pop = [] # 提前提取中国的基准数据,避免循环内重复查询 china_row = df[df.country == "China"].iloc[0] base_pop = china_row["population"] growth_rate = 1 + float(china_row["yearly_change"].replace("%", "")) / 100 for year in range(1, 101): current_pop = base_pop * (growth_rate ** year) China_pop.append(current_pop)
计算完成后可以直接用该列表构造符合要求的DataFrame:
import pandas as pd pop_df = pd.DataFrame({ "year": range(1, 101), "population": China_pop })
最优实现:向量化计算替代循环
pandas和numpy支持向量化运算,不需要写Python层的for循环逐次计算,代码更简洁、运行速度更快,不会出现类型冗余问题:
import pandas as pd import numpy as np # 提取固定基准参数 china_row = df[df.country == "China"].iloc[0] base_pop = china_row["population"] growth_rate = 1 + float(china_row["yearly_change"].replace("%", "")) / 100 # 批量生成所有年份的预测数据 pop_df = pd.DataFrame({"year": np.arange(1, 101)}) pop_df["population"] = base_pop * (growth_rate ** pop_df["year"])
补充说明:如果你后续遇到需要把整列Series转为无额外属性的原生Python列表的场景,直接调用Series的
.tolist()方法即可。
内容的提问来源于stack exchange,提问作者beridzeg45
相关产品推荐
相关产品推荐

