Используйте значения столбцов в Pandas DataFrame для заполнения строки строка за строкой - PullRequest
0 голосов
/ 07 сентября 2018

Скажем, у вас есть фрейм данных:

import pandas as pd

sales = [{'account': 'Jones LLC', 'nuts': 150, 'bolts': 200, 'totalval': 140, 'Cur': 'pesos'},
         {'account': 'Alpha Co',  'nuts': 200, 'bolts': 210, 'totalval': 215, 'Cur': 'euros'},
         {'account': 'Blue Inc',  'nuts': 50,  'bolts': 90,  'totalval': 95 , 'Cur': 'pounds'}]

mydf = pd.DataFrame(sales)

И вы хотели бы создать строку, отмечающую прибыль месяца. Например:

"We made 140 pesos from Jones LLC. Wahoo!"

Моя первая попытка решить эту проблему состояла бы в том, чтобы взять строку шаблона с заполнителями и отформатировать ее с ежемесячными числами строка за строкой. Обратите внимание, что эти месячные числа являются целыми числами, а не строками.

celebstring = "We made amt Cur from Jones LLC. Woohoo!"

def createpr(inputdf):
    for index, row in inputdf.iterrows():
        filledstring = celebstring.replace("amt","{0}".format(str(row["totalval"]))).replace('Cur','{0}'.format(str(row['Cur'])))
        inputdf['fullstring'] = filledstring
    return inputdf

df2 = createpr(mydf)

Но когда вы запускаете этот код, поле 'fullstring' для ВСЕХ строк заполняется только значениями из последней строки. Фрейм данных выглядит следующим образом (обратите внимание, я удалил два столбца для удобства чтения):

sales = [{'account': 'Jones LLC','totalval': 140, 'Cur': 'pesos', 'fullstring': 'We got an order totaling 95 pounds selling parts wahoo!'},
         {'account': 'Alpha Co','totalval': 215, 'Cur': 'euros', 'fullstring': 'We got an order totaling 95 pounds selling parts wahoo!'},
         {'account': 'Blue Inc','totalval': 95 , 'Cur': 'pounds','fullstring': 'We got an order totaling 95 pounds selling parts wahoo!'}]

Как вы получаете функцию для замены значений в соответствии с соответствующими значениями в каждой строке?

1 Ответ

0 голосов
/ 07 сентября 2018

проще в использовании format_map

In [40]: mydf.apply('We made {totalval} pesos from {account}. Woohoo!'.format_map, axis=1)
Out[40]:
0    We made 140 pesos from Jones LLC. Woohoo!
1     We made 215 pesos from Alpha Co. Woohoo!
2      We made 95 pesos from Blue Inc. Woohoo!
dtype: object

Назначить обратно с

In [46]: mydf.assign(fullstring=mydf.apply(
          'We made {totalval} pesos from {account}. Woohoo!'.format_map, axis=1))
Out[46]:
      Cur    account  bolts  nuts  totalval  \
0   pesos  Jones LLC    200   150       140
1   euros   Alpha Co    210   200       215
2  pounds   Blue Inc     90    50        95

                                  fullstring
0  We made 140 pesos from Jones LLC. Woohoo!
1   We made 215 pesos from Alpha Co. Woohoo!
2    We made 95 pesos from Blue Inc. Woohoo!

Для dict вы можете использовать to_dict

In [48]: mydf.assign(fullstring=mydf.apply(
              'We made {totalval} pesos from {account}. Woohoo!'.format_map, axis=1)
             ).to_dict(orient='r')
Out[48]:
[{'Cur': 'pesos',
  'account': 'Jones LLC',
  'bolts': 200,
  'nuts': 150,
  'totalval': 140,
  'fullstring': 'We made 140 pesos from Jones LLC. Woohoo!'},
 {'Cur': 'euros',
  'account': 'Alpha Co',
  'bolts': 210,
  'nuts': 200,
  'totalval': 215,
  'fullstring': 'We made 215 pesos from Alpha Co. Woohoo!'},
 {'Cur': 'pounds',
  'account': 'Blue Inc',
  'bolts': 90,
  'nuts': 50,
  'totalval': 95,
  'fullstring': 'We made 95 pesos from Blue Inc. Woohoo!'}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...