Как мне может удаваться создать функцию, которая стоила бы мне для того, чтобы наполнить стоимость в колонне обменного курса
df1
"date" "value" "Exchange_Rate"
2019-Jan 35691
2019-Jan 17076
2019-Dec 988
2019-Dec 1996
df2
"exchange_rate" "date" "real_or_forecast"
19.126386 2019-Jan real
19.197585 2019-Feb real
19.269133 2019-Mar real
19.089059 2019-Apr real
19.042815 2019-May real
19.142962 2019-Jun real
NaN 2019-Jul forecast
NaN 2019-Aug forecast
19.237154 2019-Sep forecast
NaN 2019-Oct forecast
19.559262 2019-Nov forecast
NaN 2019-Dec forecast
19.559262 2020-Jan forecast
def get_fill_currency(df):
for value in df['date']
if df1['date'] == date :
return value['exchange_rate']
df1
"date" "value" "Exchange_Rate"
2019-Jan 35691 19.126386
2019-Jan 17076 19.126386
2019-Dec 988 19.559262
2019-Dec 1996 19.559262
Для interporlar недействительная стоимость у тебя есть в твой disposici¦n pandas.Series.interpolate
, по умолчанию осуществляется линейный interpolaci¦n:
>>> df2['exchange_rate'].interpolate(method="linear") 0 19.126386 1 19.197585 2 19.269133 3 19.089059 4 19.042815 5 19.142962 6 19.174359 7 19.205757 8 19.237154 9 19.398208 10 19.559262 11 25.057631 12 30.555999
, но ты имеешь múltiples métodos осуществленные. Например используя предварительную не недействительную стоимость (padding):
>>> df2['exchange_rate'].interpolate(method="pad") 0 19.126386 1 19.197585 2 19.269133 3 19.089059 4 19.042815 5 19.142962 6 19.142962 7 19.142962 8 19.237154 9 19.237154 10 19.559262 11 19.559262 12 30.555999
Данные - данные твоего примера, кроме для última линия (2020-Jan), для которой я изменил стоимость от 19.559262 до 30.555999 для того, чтобы было видно различие между métodos.
Относительно перемещения стоимости в df1 с df2, действительно есть большие формы, включенные использовать один for
, как ты выдвигаешь, или funci¦n с pandas.DataFrame.apply
. Тем не менее я верю в то, что форма mÃ: s ¦ptima для этих случаев состоит в том, чтобы использовать pandas.Series.map
, которая позволяет брать стоимость в mapear с другой серии, используя ¦-ndices как ключ.
import io
import pandas as pd
df1_data = io.StringIO("""\
date value
2019-Jan 35691
2019-Jan 17076
2019-Dec 988
2019-Dec 1996
""")
df2_data = io.StringIO("""\
exchange_rate date real_or_forecast
19.126386 2019-Jan real
19.197585 2019-Feb real
19.269133 2019-Mar real
19.089059 2019-Apr real
19.042815 2019-May real
19.142962 2019-Jun real
NaN 2019-Jul forecast
NaN 2019-Aug forecast
19.237154 2019-Sep forecast
NaN 2019-Oct forecast
19.559262 2019-Nov forecast
NaN 2019-Dec forecast
19.559262 2020-Jan forecast
""")
df1 = pd.read_csv(df1_data, sep="\s+")
df2 = pd.read_csv(df2_data, sep="\s+")
df1["exchange_rate"] = df1["date"].map(df2.set_index('date')['exchange_rate']
.interpolate(method="linear")
)
>>> df1 date value exchange_rate 0 2019-Jan 35691 19.126386 1 2019-Jan 17076 19.126386 2 2019-Dec 988 19.559262 3 2019-Dec 1996 19.559262
, Если ты хочешь, чтобы interpolaci¦n применялся к самому df2, не-нравься, apl¦-имей осадку раньше:
df2["exchange_rate"].interpolate(method="linear", inplace=True)
df1["exchange_rate"] = df1["date"].map(df2.set_index('date')['exchange_rate'])
Para применять pandas.Series.map
- необходимо, чтобы серия той, которую берут данные, считала ¦-ndice колонну, которая используется, чтобы присоединять стоимость обоих DataFrames, date
в нашем примере. Это asÃ, - потому что каждая стоимость date
df1
идет искать в ¦-ndice серии, перешедшей в map
и стоимость, ассоциируемая с этим ¦-ndice (нахожения) - использованный, чтобы заселять колонну exchange_rate
из df1
.
, Если в нашем случае колонна date
уже снаружи ¦-ndice df2
, bastar¦ - в с:
df1["exchange_rate"] = df1["date"].map(df2['exchange_rate'].interpolate(method="linear"))
, если это ¦-ndice в обоих DataFrames, тогда мы можем делать:
df1["exchange_rate"] = df1.index.map(df2['exchange_rate'].interpolate(method="linear"))