Pandas — Устанавливает значение в столбце на основе значений в 3 других столбцах

#python #pandas #data-analysis

#python #pandas #анализ данных

Вопрос:

У меня есть дамп транзакций. Столбцы в наборе данных предоставляют информацию о валюте и о том, к какой FS переходит каждая транзакция.

Я хочу переводить валюты по двум разным курсам в зависимости от того, в какую FS поступает транзакция. Существуют две валюты USD и CAD. Есть два FS. У меня есть столбец со всеми суммами в долларах США и один со всеми в CAD. Смотрите таблицу ниже для примера.

 FS  CUR USD     CAD    USD_FS

BS  USD 1000    1364    X
BS  USD 2000    2729    X
IS  CAD 300     409     X
IS  USD 55      75      X
BS  CAD 1312    1790    X
IS  CAD 3156    4306    X
IS  USD 32165   43881   X
BS  CAD 32156   43869   X
  

Псевдокод, который я хочу реализовать в pandas, является:

 ye_rate = 1.3642
average_rate = 1.2957
if FS == 'BS' and CUR == 'CAD':
   USD_FS = CAD/ye_rate
else if FS == 'IS' and CUR == 'USD':
   USD_FS = CAD/average_rate
else:
   USD_FS = USD
  

Это то, что у меня есть в pandas до сих пор:

 for i in range(0, len(df)):
    if df.loc[i]['Currency'] == 'CAD':
        if df.loc[i]['FS'] == 'BS':
            df.loc[i]['USD_FS'] = df.loc[i]['CAD']/ye_rate
        if df.loc[i]['FS'] == 'IS':
            df.loc[i]['USD_FS'] = df.loc[i]['CAD']/average_rate
  

Я получаю эту ошибку:

Значение пытается быть установлено в копии фрагмента из фрейма данных

Для примера таблицы выше мне нужен следующий вывод:

 FS  CUR USD     CAD     USD_FS

BS  USD 1000    1364    1000
BS  USD 2000    2729    2000
IS  CAD 300     409     409/average_rate
IS  USD 55      75      55
BS  CAD 1312    1790    1790/ye_rate
IS  CAD 3156    4306    4306/average_rate
IS  USD 32165   43881   32165
BS  CAD 32156   43869   43869/ye_rate
  

Ответ №1:

Вам может понадобиться np.select

 rate1=1
rate2=2
s1=(df.FS=='BS')amp;(df.CUR=='CAD')
s2=(df.FS=='IS')amp;(df.CUR=='USD')
np.select([s1,s2],[df.CAD*rate1,df.CAD*rate2],default = df.CAD)
#df.CAD=np.select([s1,s2],[df.CAD*rate1,df.CAD*rate2],default = df.CAD)

Out[280]: 
array([ 1364,  2729,   409,   150,  1790,  4306, 43881, 43869],
      dtype=int64)
  

Комментарии:

1.Спасибо, это сработало. Я немного отредактировал свой вопрос и смог получить желаемый результат с помощью этого: s1 = (df.FS=='BS')amp;(df.Currency=='CAD') s2 = (df.FS=='IS')amp;(df.Currency=='CAD') df['USD_FS'] = np.select([s1,s2],[df.CAD/ye_rate, df.CAD/average_rate],default = df.USD)

Ответ №2:

Если вы хотите продолжать полагаться только на Pandas (даже если он построен поверх Numpy), правильный синтаксис для использования индексатора .loc является:

df.loc[row_indexer,column_indexer]

Согласно документации Pandas:

Это правильный метод доступа

В [305]: dfc = pd.DataFrame({‘A’:[‘aaa’,’bbb’,’ccc’],’B’:[1,2,3]})

В [306]: dfc.loc[0,’A’] = 11

Это вообще не сработает, и поэтому его следует избегать

dfc.loc[0][‘A’] = 1111