Python 每年合并并乘以2个数据帧
我有一个数据帧“X”,看起来像:Python 每年合并并乘以2个数据帧,python,pandas,dataframe,merge,Python,Pandas,Dataframe,Merge,我有一个数据帧“X”,看起来像: ticker | date | close | A | 2002-01-02 | 20 | A | 2002-01-11 | 10 | ... A | 2003-01-11 | 15 | ... C | 2002-01-31 | 40 | C | 2002-02-01 | 50 |
ticker | date | close |
A | 2002-01-02 | 20 |
A | 2002-01-11 | 10 |
...
A | 2003-01-11 | 15 |
...
C | 2002-01-31 | 40 |
C | 2002-02-01 | 50 |
...
C | 2003-02-01 | 56 |
ticker | date | annual weight |
A | 2002-03-31 | 0.2 |
A | 2003-02-11 | 0.5 |
...
C | 2002-01-31 | 0.6 |
C | 2003-02-01 | 1.2 |
...
另一个数据帧“Y”看起来像:
ticker | date | close |
A | 2002-01-02 | 20 |
A | 2002-01-11 | 10 |
...
A | 2003-01-11 | 15 |
...
C | 2002-01-31 | 40 |
C | 2002-02-01 | 50 |
...
C | 2003-02-01 | 56 |
ticker | date | annual weight |
A | 2002-03-31 | 0.2 |
A | 2003-02-11 | 0.5 |
...
C | 2002-01-31 | 0.6 |
C | 2003-02-01 | 1.2 |
...
我想将“Y”中的“年权重”乘以“X”中的“结束”,得到“X”中的一个新列,称为“权重*结束”,因为每个股票代码每年只有1个年权重
此外,X包含Y的所有日期值,但Y仅包含X的少数日期值
因此,我遇到的问题是试图像这样合并:
X = X.merge(Y, on = ['ticker', 'date'])
然后做乘法运算
X['weight*close'] = Y[['annual weight'].multiply(X['close'], axis=Index)
不会起作用,因为它试图在“日期”上合并,该日期只在X和Y中查找日期,然后丢弃X中不在Y中的值-但我想要全部
如何将所有值保留在X中,并仅按年份进行乘法?您可以对数据帧重新采样以对齐日期。首先,将数据列转换为
DateTime
,如果它们尚未DateTime
:
X.date = pd.to_datetime(X.date)
Y.date = pd.to_datetime(Y.date)
然后,按股票代码分组并重新采样。我使用平均值进行重采样,您可能需要使用sum
或任何其他聚合函数
X_resampled = X.set_index('date').groupby('ticker').resample('1Y').mean()
Y_resampled = Y.set_index('date').groupby('ticker').resample('1Y').mean()
最后,找到产品:
X_resampled['close'] * Y_resampled['annual weight']
#ticker date
#A 2002-12-31 3.0
# 2003-12-31 7.5
#C 2002-12-31 27.0
# 2003-12-31 67.2
您可以发布预期的输出吗?只需在这两个数据框中创建年份变量并合并它们。我成功地为两个数据框创建了一个年份变量以合并,但X有1700000多行,Y有27000多行,我认为这是由于绝对的容量给了我一个内存错误。