Python循环中将DataFrame首行复制到新DataFrame的实现问题
问题原因
你的代码里每次循环都会重新创建空的df_4,也就是df_4 = pd.DataFrame()这行放在循环内部,导致每次循环都会清空之前的df_4,最终只能保留最后一次循环的结果,前面的所有数据都被覆盖了。
解决方法
以下两种方案都能解决问题,第二种在数据量较大时效率更高:
方案一:提前初始化df_4,循环内追加数据
把空DataFrame的初始化移到循环外面,每次循环直接向同一个df_4中追加内容:
import pandas as pd import yfinance as yf df = pd.read_excel(r'C:\Users\vikto\OneDrive\Skrivbord\Python\symbols2.xlsx') mylist = df['Symbols'].tolist() # 提前初始化空DataFrame df_4 = pd.DataFrame() for item in mylist: ticker = yf.Ticker(item) df_1 = pd.DataFrame(ticker.earnings) df_2 = pd.DataFrame(ticker.quarterly_earnings) df_2.loc['proforma'] = df_2.sum(numeric_only=True, axis=0) df_2 = df_2.iloc[-1:] df_3 = pd.concat([df_1, df_2]) df_3 = df_3.transpose() df_3 = df_3.loc[:, ::-1] # 用pd.concat替代已弃用的append方法 df_4 = pd.concat([df_4, df_3.head(1)])
方案二:先收集所有子DataFrame,最后一次性合并
通过列表临时存储每次处理后的首行数据,最后统一合并,避免循环内频繁修改df_4带来的性能损耗:
import pandas as pd import yfinance as yf df = pd.read_excel(r'C:\Users\vikto\OneDrive\Skrivbord\Python\symbols2.xlsx') mylist = df['Symbols'].tolist() # 用列表存储所有处理后的子DataFrame temp_dfs = [] for item in mylist: ticker = yf.Ticker(item) df_1 = pd.DataFrame(ticker.earnings) df_2 = pd.DataFrame(ticker.quarterly_earnings) df_2.loc['proforma'] = df_2.sum(numeric_only=True, axis=0) df_2 = df_2.iloc[-1:] df_3 = pd.concat([df_1, df_2]) df_3 = df_3.transpose() df_3 = df_3.loc[:, ::-1] # 将首行加入临时列表 temp_dfs.append(df_3.head(1)) # 最后一次性合并所有子DataFrame df_4 = pd.concat(temp_dfs)
内容的提问来源于stack exchange,提问作者Viktor Martinssen
相关产品推荐
相关产品推荐

