我有2列:组和级别范围。每个“组”都有一个水果列表,每个“级别范围”都有一个级别范围,例如“ L1-L4”。
所需的结果是下图中的“水果”和“等级”列。
因此,如果范围是“ L2-L3”,则级别列将对第一行说“ 2”,然后对下一行说“ 3”。我还想将“组”列表中的每个项目添加到“水果”列。
任何帮助将不胜感激!谢谢!
这是我已经完成的工作:
我创建了2个帮助器列:“ level_repeat”和“ grouping_repeat”,以帮助我复制必要的行。
df['level_repeat'] = df['Level'].replace(['L1-L6', 'L1-L2', 'L1-L3', 'L4-L6', 'L3-L6', 'L2-L6'], [6, 2, 3, 2, 3, 4])
df['grouping_repeat'] = df['Group'].str.len()
df_new = pd.DataFrame([df.ix[idx] for idx in df.index
for _ in range(df.ix[idx]['level_repeat'])]).reset_index(drop=True)
df_new = pd.DataFrame([df_new.ix[idx] for idx in df_new.index
for _ in range(df_new.ix[idx]['grouping_repeat'])]).reset_index(drop=True)
结果是,对于上面的示例,我将有10行,其中该组有2个项目,并且级别范围跨越5个级别(2 * 5 = 10)。但是,在将数据插入“水果”和“级别”列中时,我仍然需要帮助。
这是一种方法,我首先从'Level Range'创建一个带有数字的列'level_list' range
,因此对于'L2-L5',该列表将为[2,3,4,5]。
df['level_list'] = (df['Level Range'].str.split('-',expand=True)
.stack().str[-1].unstack()
.apply(lambda x: range(int(x[0]),int(x[1])+1),1))
现在,使用itertools中的产品和带有列表的两列(Group和level_list),您可以创建新的数据框:
from itertools import product
df_new = pd.DataFrame([ [ind, group, level_range, g, l]
for ind, group, level_range, level_list
in df[['Group','Level Range', 'level_list']].itertuples()
for l, g in product(level_list, group) ],
columns = ['original_ind','Group', 'Level Range', 'Fruit','Level'])
输入像
df = pd.DataFrame({'Group':[['Apple','Banana']], 'Level Range': ['L2-L5']})
,
结果为df_new
:
original_ind Group Level Range Fruit Level
0 0 [Apple, Banana] L2-L5 Apple 2
1 0 [Apple, Banana] L2-L5 Banana 2
2 0 [Apple, Banana] L2-L5 Apple 3
3 0 [Apple, Banana] L2-L5 Banana 3
4 0 [Apple, Banana] L2-L5 Apple 4
5 0 [Apple, Banana] L2-L5 Banana 4
6 0 [Apple, Banana] L2-L5 Apple 5
7 0 [Apple, Banana] L2-L5 Banana 5
请注意,如果您不在乎原始索引,则可以删除该列或不创建该列
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句