如何为多个加密货币DataFrame应用函数并生成2021年数据的新DataFrame?
问题原因分析
你的代码存在两个核心问题:
- 循环变量赋值无法保留批量结果:循环里的
dataframe = date_func(dataframe)只是把处理后的DataFrame临时赋值给循环变量,每次循环都会覆盖这个变量,最终仅保留最后一个DataFrame(即xrp)的处理结果,前面的所有结果都会丢失。 - 缺少原始DataFrame与名称的映射:你只把DataFrame对象存入列表,没有关联它们的名称(比如
bitcoin、aave),自然无法自动生成bitcoin21、aave21这类对应命名的变量。
解决方案
方法1:用字典存储处理结果(推荐,避免污染全局命名空间)
先将原始DataFrame和对应名称配对成字典,遍历处理后把结果存入新字典,后续通过字典键调用即可:
import pandas as pd # 用字典存储原始DataFrame,键为名称字符串,值为对应DataFrame df_dict = { 'bitcoin': bitcoin, 'have': have, 'binance': binance, 'Cardano': Cardano, 'chainlink': chainlink, 'cosmos': cosmos, 'crypto_com': crypto_com, # 原名称含空格,建议改为下划线命名避免语法问题 'dogecoin': dogecoin, 'eos': eos, 'Ethereum': Ethereum, 'iota': iota, 'litecoin': litecoin, 'monero': monero, 'nem': nem, 'Polkadot': Polkadot, 'Solana': Solana, 'stellar': stellar, 'tether': tether, 'uni_swap': uni_swap, # 空格替换为下划线 'usdcoin': usdcoin, 'wrapped': wrapped, 'xrp': xrp } def date_func(df): # 复制原DataFrame,避免修改原始数据 df_copy = df.copy() df_copy['Date'] = pd.to_datetime(df_copy['Date']) df_copy = df_copy.set_index('Date').sort_index() df_copy = df_copy['2021-01-01':] return df_copy # 批量处理并生成带21后缀的结果字典 df_21_dict = {} for name, df in df_dict.items(): new_name = name + '21' df_21_dict[new_name] = date_func(df) # 调用示例:df_21_dict['bitcoin21']、df_21_dict['uni_swap21']
方法2:直接生成全局变量(不推荐,易引发命名混乱)
如果一定要生成bitcoin21这类独立变量,可以用globals()将结果注入全局命名空间:
import pandas as pd # 定义名称与DataFrame的配对列表 df_name_pairs = [ ('bitcoin', bitcoin), ('have', have), ('binance', binance), # 其他DataFrame与名称的配对... ('xrp', xrp) ] def date_func(df): df_copy = df.copy() df_copy['Date'] = pd.to_datetime(df_copy['Date']) df_copy = df_copy.set_index('Date').sort_index() df_copy = df_copy['2021-01-01':] return df_copy # 批量生成带21后缀的全局变量 for name, df in df_name_pairs: new_name = name.replace(' ', '_') + '21' globals()[new_name] = date_func(df) # 直接调用示例:bitcoin21、uni_swap21
额外优化建议
- 原始DataFrame名称中的空格(如
crypto com)不符合Python变量命名规范,建议提前将原始DataFrame重命名为crypto_com这类格式,避免后续操作出错。 - 在
date_func中使用df.copy()复制原数据,防止误修改原始DataFrame。
内容的提问来源于stack exchange,提问作者franz_list
相关产品推荐
相关产品推荐

