我有以下包含代码/产品和周数列的df。
code. Product . weeks
123 . product1 . 1;2
123 . product1 . 3
321 . product2 . 4;5;6
321 . product2 . 7
对于那些超过1周的行(例如1; 2或4; 5; 6),我想重复这些行。我期望的输出如下:
code. Product . weeks
123 . product1 . 1
123 . product1 . 2
123 . product1 . 3
321 . product2 . 4
321 . product2 . 5
321 . product2 . 6
321 . product2 . 7
使用熊猫或numpy的最佳方法是什么?
答案 0 :(得分:2)
使用:
df = (df.set_index(['code','Product'])['weeks']
.str.split(';', expand=True)
.stack()
.reset_index(level=2, drop=True)
.reset_index(name='weeks'))
print (df)
code Product weeks
0 123 product1 1
1 123 product1 2
2 123 product1 3
3 321 product2 4
4 321 product2 5
5 321 product2 6
6 321 product2 7
说明:
set_index
split
创建DataFrame
stack
重塑reset_index
清除数据最后一次另一种解决方案:
from itertools import chain
weeks = df['weeks'].str.split(';')
lens = weeks.str.len()
df = pd.DataFrame({
'code' : df['code'].repeat(lens),
'Product' : df['Product'].repeat(lens),
'weeks' : list(chain.from_iterable(weeks.values.tolist())),
})
print (df)
code Product weeks
0 123 product1 1
0 123 product1 2
1 123 product1 3
2 321 product2 4
2 321 product2 5
2 321 product2 6
3 321 product2 7
说明:
答案 1 :(得分:0)
#assume test.xlsx is your data
test = pd.read_excel('test.xlsx')
test_processed = pd.DataFrame(columns=test.columns)
for index, row in test.iterrows():
weeks = row['weeks'].split(';')
for week in weeks:
test_processed = test_processed.append({'code':row['code'], 'Product':row['Product'],'weeks':week}, ignore_index=True)