Текст из Панды Dataframe - PullRequest
       7

Текст из Панды Dataframe

0 голосов
/ 01 октября 2018

У меня есть датафрейм Pandas, который содержит отдельные случаи проданного количества жевательных конфет, шоколада и монетных дворов.Они суммируются и сортируются по номеру недели.Сейчас я перевожу это в текст, который затем отправляется по электронной почте, без использования следующего метода:

pd['text'] = 'In calendar week (' + pd['weeknumber'].map(str) + '), customers have bought ' + pd['gummibears'].map(str) + 'kg of gummibears, ' + pd['chocolate'].map(str) + 'kg of chocolate, as well as ' + pd['mint'].map(str) + 'kg of mints.'

В идеале, результат даст хороший текст с описанием продаж.Тем не менее, возможно, что было продано 0 кг, что, конечно, также выглядит, как-то так:

>>> "In calendar week 25, customers have bought 0kg of gummibears, 25kg of chocolate, as well as 0kg of mints."
>>> "In calendar week 26, customers have bought 6kg of gummibears, 0kg of chocolate, as well as 2kg of mints."

Это работает, но сбивает с толку читателя.Есть ли элегантный способ отфильтровать все экземпляры с 0 кг, не вкладывая несколько циклов?Предпочтительно, результат сверху будет выглядеть следующим образом:

>>> "In calendar week 25, customers have bought 25kg of chocolate."
>>> "In calendar week 26, customers have bought 6kg of gummibears, as well as 2kg of mints."

1 Ответ

0 голосов
/ 01 октября 2018

Вы можете использовать пользовательскую функцию с 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']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...