Вы можете использовать пользовательскую функцию с numpy.where
и логической маской, созданной eq
(==
), но текст должен быть нормализован для общего решения:
df = pd.DataFrame({
'weeknumber':[1,2,3,4,5,6],
'gummibears':[7,8,9,4,0,0],
'chocolate': [0,3,5,0,1,0],
'mint': [5,3,0,9,2,0]
})
def kg_to_string(col):
return np.where(df[col].eq(0), '', ' ' + df[col].astype(str) + 'kg of '+ col +',')
start = 'In calendar week (' + df['weeknumber'].astype(str) + '), customers have bought'
#boolean mask if all columns are 0
mask = df[['gummibears','gummibears','mint']].eq(0).all(axis=1)
df['text'] = start + np.where(mask, ' nothing', kg_to_string('gummibears') +
kg_to_string('chocolate') +
kg_to_string('mint'))
#remove last ,
df['text'] = df['text'].str.rstrip(',')
print (df['text'].tolist())
['In calendar week (1), customers have bought 7kg of gummibears, 5kg of mint',
'In calendar week (2), customers have bought 8kg of gummibears, 3kg of chocolate,
3kg of mint',
'In calendar week (3), customers have bought 9kg of gummibears, 5kg of chocolate',
'In calendar week (4), customers have bought 4kg of gummibears, 9kg of mint',
'In calendar week (5), customers have bought 1kg of chocolate, 2kg of mint',
'In calendar week (6), customers have bought nothing']