从DataFrame生成Series字典:单元素Series场景下数据丢失问题求助
解决DataFrame转Series字典时小分组数据丢失的问题
我明白你的问题了——当分组只有2行数据时,原本应该生成带单个元素的Series,结果却丢失了索引(比如Meat分组里的Beef),这是因为原代码里的iloc[1:,1:-1]和两次set_axis的组合在处理短分组时出了问题。
问题根源分析
原代码里的iloc[1:,1:-1]是取分组中从第二行开始、列范围从第1列到倒数第二列的数据。当分组只有2行时,这个列范围虽然能取到值,但后续的squeeze()会把单行单列的结果转换成标量,直接丢失了原本的索引(也就是col_1里的Beef)。另外,两次set_axis的操作其实是绕了弯路,反而增加了出错的概率。
修正后的代码方案
我们可以简化逻辑,直接针对每个分组提取需要的部分:
import pandas as pd df = pd.DataFrame({'col_1': ['Fruit', 'Apple', 'Pear','Orange','Vegtable','Pea','Lettus','Meat','Beef'], 'col_2': ['Fruit', .25, .25,.5,'Vegtable',.6,.4,'Meat',1], 'group':[1,1,1,1,2,2,2,3,3]}) # 修正后的字典推导式 dict_of_series = { g['col_2'].iloc[0]: # 用分组第一行的col_2值作为字典的键 g.iloc[1:].set_index('col_1')['col_2'] # 取分组从第二行开始的部分,将col_1设为索引,提取col_2作为Series for i, g in df.groupby('group') }
验证效果
运行这段代码后,你会得到预期的结果:
dict_of_series['Fruit']是包含Apple:0.25、Pear:0.25、Orange:0.5的Seriesdict_of_series['Vegtable']是包含Pea:0.6、Lettus:0.4的Seriesdict_of_series['Meat']是包含Beef:1.0的Series(索引和值都完整保留)
这个方案不管分组有2行还是更多行,都能稳定生成带索引的Series,不会丢失任何数据。
内容的提问来源于stack exchange,提问作者Jonathan Hay
相关产品推荐
相关产品推荐

