Python pandas - Разделить столбец в dataframe1 со столбцом в dataframe2 на основе другого столбца в dataframe1 - PullRequest
1 голос
/ 20 февраля 2020

Dateframe1

df = pd.DataFrame(SQL_Query, columns=[ X,Y . . . . Currency,Amount] 

Index         X             Y  ...         Currency          Amount
0             74            1  ...         USD               100
1             75            1  ...         EUR               5000
2             76            1  ...         AUD               300
3             79            1  ...         EUR               750

[1411137 rows x 162 columns]

Большой SQL запрос, поэтому я избегаю выписывать все столбцы.

df1=pd.read_excel(r`FX_EUR.xlsx)

Index       Currency      FX
0             AUD      1.61350
1             BGN      1.95580
2             BRL      4.51450
3             CAD      1.45830
4             CHF      1.09280

Итак, чего бы я хотел добиться, это сделать поиск в DF1, чтобы увидеть, какая валюта используется, а затем разделить столбец «DF1 Amount» на столбец «DF2 FX» и на это для всех строк в DF1. Либо сделав третий DF3, либо создав новый столбец в DF1 с именем Amount_EUR.

Есть идеи, как написать этот код?

Ответы [ 3 ]

0 голосов
/ 20 февраля 2020

Вы можете использовать слияние для построения серии, содержащей правильный FX (такой же Currency) с тем же индексом, что и df. Деление тогда тривиально:

fx = df.merge(df1, 'left', on='Currency')['FX']
df.loc[~ fx.isna(),'EUR_Amount'] = df.loc[~ fx.isna()]['Amount']/fx.loc[~ fx.isna()]

С вашими данными выборки это дает:

        X  Y  ... Currency  Amount  EUR_Amount
Index                                         
0      74  1  ...      USD     100         NaN
1      75  1  ...      EUR    5000         NaN
2      76  1  ...      AUD     300  185.931205
3      79  1  ...      EUR     750         NaN
0 голосов
/ 20 февраля 2020

Вы также можете использовать join для объединения двух фреймов данных на основе значений их валют следующим образом:

df.set_index(["Currency"], inplace=True)
df1.set_index(["Currency"], inplace=True)

df = df.join(df1["FX"])
df["Amount_EUR"] = df.loc[~df["FX"].isna()]["Amount"] / df["FX"].loc[~df["FX"].isna()]

df.drop(["FX"], axis="columns", inplace=True)
df.reset_index(inplace=True)

print(df)

Вывод будет:

  Currency   X  Y  Amount  Amount_EUR
0      AUD  76  1     300  185.931205
1      EUR  75  1    5000         NaN
2      EUR  79  1     750         NaN
3      USD  74  1     100         NaN

надеюсь, это поможет !

0 голосов
/ 20 февраля 2020

Вы можете использовать map, чтобы применить преобразование -

import pandas as pd
df = pd.DataFrame({"Currency": ['USD', 'EUR', 'AUD', 'EUR'], "Amount": [100, 5000, 300, 750]})

df1 = pd.DataFrame({"Currency": ["AUD", "BGN", "BRL", "CAD", "EUR"], "FX": [1.6, 1.9, 4.5, 1.5, 1.1]})
df1 = df1.set_index("Currency")

df['FX'] = df['Currency'].map(df1.FX)
df['FX_Adj_Amt'] = df['Amount'].div(df['FX'])

df
#  Currency  Amount   Fx   FX_Adj_Amt
#0      USD     100  NaN          NaN
#1      EUR    5000  1.1  4545.454545
#2      AUD     300  1.6   187.500000
#3      EUR     750  1.1   681.818182
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...