如何在Pandas中按币种分别计算BTC和ETH的价格涨跌幅?
解决BTC和ETH涨跌幅计算的分离问题及赋值警告
你遇到的警告源于拆分出的DataFrame是原数据的切片副本,pandas无法确认你是否要修改原数据,因此抛出提示。以下是几种实用的解决办法:
方法1:显式创建副本消除警告
拆分数据时用.copy()生成独立副本,后续修改就不会触发警告:
# 拆分BTC和ETH数据,生成独立副本 btc_df = df[df['Symbol'] == 'BTC'].copy() eth_df = df[df['Symbol'] == 'ETH'].copy() # 计算BTC涨跌幅 btc_initial = btc_df['Close'].iloc[0] btc_df['Performance'] = 100 * (btc_df['Close'] - btc_initial) / btc_initial # 计算ETH涨跌幅 eth_initial = eth_df['Close'].iloc[0] eth_df['Performance'] = 100 * (eth_df['Close'] - eth_initial) / eth_initial
方法2:不拆分,用groupby批量计算(更高效)
直接在原DataFrame上按币种分组,一次性完成所有币种的涨跌幅计算:
# 定义涨跌幅计算函数 def calculate_performance(group): initial = group['Close'].iloc[0] group['Performance'] = 100 * (group['Close'] - initial) / initial return group # 按币种分组计算并合并结果 df = df.groupby('Symbol').apply(calculate_performance)
处理后原DataFrame会新增Performance列,分别对应BTC和ETH的涨跌幅,每个币种的计算都基于自身初始价格。
方法3:用.loc直接修改原数据(保留在原表)
如果想在原DataFrame中直接添加涨跌幅列,可通过.loc定位指定币种的行赋值:
# 计算BTC涨跌幅并写入原表 btc_initial = df[df['Symbol'] == 'BTC']['Close'].iloc[0] df.loc[df['Symbol'] == 'BTC', 'Performance'] = 100 * (df['Close'] - btc_initial) / btc_initial # 同理处理ETH eth_initial = df[df['Symbol'] == 'ETH']['Close'].iloc[0] df.loc[df['Symbol'] == 'ETH', 'Performance'] = 100 * (df['Close'] - eth_initial) / eth_initial
这种方式直接操作原DataFrame,不会产生副本警告,同时保留所有数据在一张表中。
内容的提问来源于stack exchange,提问作者granadallama
相关产品推荐
相关产品推荐

