如何用Pandas DataFrame实现类似MATLAB元胞数组的数据存储?
处理电池循环数据的Python数据结构方案
从MATLAB转Python处理这类数据,以下几个方案完全匹配你要的“按循环-充放电层级分割”的需求,选哪个看你后续操作习惯:
1. 嵌套字典(最贴近MATLAB元胞数组逻辑)
用字典顶层对应循环次数,第二层用数字索引对应充放电数据,和你原来data{cycle}{1/2}的调用逻辑几乎一致:
import pandas as pd # 假设你的原始数据存在df里,包含'cycle number'、'charge capacity'、'discharge capacity'列 cycle_dict = {} # 先按循环次数分组 grouped = df.groupby('cycle number') for cycle_num, group in grouped: # 把每个循环的充放电数据存成字典,1对应充电、2对应放电 cycle_dict[cycle_num] = { 1: group['charge capacity'].values, # 等价MATLAB的data{cycle_num}{1} 2: group['discharge capacity'].values # 等价MATLAB的data{cycle_num}{2} } # 调用示例 print(cycle_dict[1][1]) # 循环1的充电容量数组 print(cycle_dict[4][2]) # 循环4的放电容量数组
2. 嵌套列表(索引式访问)
如果习惯用数字索引而非字典键,可直接用嵌套列表,注意Python列表从0开始,所以预留索引0的位置让索引1对应循环1:
max_cycle = df['cycle number'].max() # 初始化嵌套列表,长度为最大循环数+1 cycle_list = [[] for _ in range(max_cycle + 1)] for cycle_num, group in grouped: # 每个循环位置存储[充电数据, 放电数据] cycle_list[cycle_num] = [ group['charge capacity'].values, group['discharge capacity'].values ] # 调用示例 print(cycle_list[1][0]) # 循环1的充电容量(对应原来的data{1}{1}) print(cycle_list[4][1]) # 循环4的放电容量(对应原来的data{4}{2})
3. 直接用pandas GroupBy对象(最高效的数据分析方式)
如果后续还要对数据做过滤、统计、可视化等操作,没必要转成其他结构,直接用GroupBy对象更省内存,操作也更灵活:
grouped = df.groupby('cycle number') # 获取指定循环的充放电数据 cycle1_charge = grouped.get_group(1)['charge capacity'] cycle4_discharge = grouped.get_group(4)['discharge capacity'] # 甚至可以直接做批量操作,比如计算每个循环的平均充电容量 avg_charge_per_cycle = grouped['charge capacity'].mean()
方案选择建议
- 如果你只是需要类似MATLAB的索引访问逻辑,选嵌套字典或列表;
- 如果你后续要做大量数据分析操作,直接用GroupBy对象,避免数据重复存储,3万行数据的情况下效率优势很明显。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

