如何用Python计算单个CSV文件中同股票同日期的市值平均值
解决方案:计算同一股票同一日期的市值平均值
没问题,我帮你搞定这个需求!你需要的是按股票代码(Ticker)和日期(Date)分组,计算每组的市值平均值,然后导出成新的CSV文件。下面是修改后的完整代码,我会一步步解释细节:
注意事项先说明
你的原始CSV用|作为分隔符,且字段后带有空格,读取时必须指定正确的分隔规则,否则会出现列名带空格、字段值异常的问题;另外你之前的drop_duplicates不需要保留,因为那些同一Ticker+Date但不同市值的行是计算平均值的有效数据,不能删除。
完整代码实现
import pandas as pd # 读取CSV,指定分隔符为|,并跳过字段后的空格,避免列名/值带多余空格 df = pd.read_csv(data_market, sep='|', skipinitialspace=True) # 筛选2003年1月1日之后的数据(保留你原有的逻辑) df = df[(df['Date'] > '2003-01-01')] # 核心操作:按Ticker和Date分组,计算每组市值的平均值 # 重置索引将分组字段从索引转为普通列,并重命名列名符合需求 result_df = df.groupby(['Ticker', 'Date'])['Marketcap'].mean().reset_index() result_df = result_df.rename(columns={'Marketcap': 'Avg Marketcap'}) # 可选:如果需要将平均值转为整数(和你示例中的格式一致),添加此行 result_df['Avg Marketcap'] = result_df['Avg Marketcap'].round().astype(int) # 将结果保存为新的CSV文件,同样用|作为分隔符,不写入索引列 result_df.to_csv('avg_marketcap_result.csv', sep='|', index=False)
代码细节解释
sep='|', skipinitialspace=True:正确解析你的CSV格式,解决|后带空格导致的列名异常问题groupby(['Ticker', 'Date'])['Marketcap'].mean():按股票+日期的组合分组,对每组的市值字段计算平均值,这是实现需求的核心逻辑reset_index():把分组用的Ticker和Date从索引转换为普通列,保证输出的CSV结构和你期望的一致rename(columns=...):将默认的Marketcap列名改为你需要的Avg Marketcapround().astype(int):把浮点型的平均值转为整数(你示例中AB的2010-02-14平均值实际是≈1243333,应该是笔误少写了一个3,这里可以根据你的需求调整取整规则)to_csv(...):保存结果时指定分隔符为|,index=False避免把索引列写入CSV文件
运行这段代码后,生成的CSV文件就会完全符合你期望的输出格式。
内容的提问来源于stack exchange,提问作者HelloToEarth




