#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