假设我有3个df
,例如下面的那些:
df = pd.DataFrame({'Week': ['W1', 'W2', 'W3', 'W4', 'W5', 'W6', 'W7'], 'A': [34, 67, 92, 31, 90, 100, 101]})
df2 = pd.DataFrame({'Week': ['W4', 'W5', 'W6', 'W7', 'W8', 'W9', 'W10'], 'B': [75, np.nan, 53, 21, 94, 47, 88]})
df3 = pd.DataFrame({'Week': ['W12', 'W13', 'W14', 'W15', 'W16', 'W17', 'W18'], 'C': [25, 30, 40, 45, 46, 47, 48]})
[通常,当我建立股票价格数据库时,我将使用pd.merge
并使用非常有用的on='Week'
(在这种情况下)函数使用Week列将数据框合并在一起。所以我的代码将是这样的:
df = pd.merge(df, df2, on='Week', how='left')
df = pd.merge(df, df3, on='Week', how='left')
产生以下df
:
Week A B C
0 W1 34 NaN NaN
1 W2 67 NaN NaN
2 W3 92 NaN NaN
3 W4 31 75.0 NaN
4 W5 90 NaN NaN
5 W6 100 53.0 NaN
6 W7 101 21.0 NaN
这很完美,如果没有数据,我只想查看N1-W7的数据。
我被认为使用pd.concat
比pd.merge
快得多,而且当我查看数百只股票时,这确实可以帮助减少构建df
所需的时间。但是,当然,日期必须完全匹配非常重要,因此为什么我一直在on=
中使用pd.merge
函数。
到目前为止,我还无法确定如何使用pd.concat
复制此行为。有没有人有什么建议?到目前为止,我尝试过的事情看起来像这样:
df = pd.concat([df, df2], sort=True).groupby('Week').mean()
但是这导致以下结果,甚至与我想要的结果都不接近:
A B
Week
W1 34.0 NaN
W10 NaN 88.0
W2 67.0 NaN
W3 92.0 NaN
W4 31.0 75.0
W5 90.0 NaN
W6 100.0 53.0
W7 101.0 21.0
W8 NaN 94.0
W9 NaN 47.0
非常感谢您的帮助,欢呼
编辑:
对不起,请澄清一下,我的预期输出是df
下降一半,这是:
Week A B C
0 W1 34 NaN NaN
1 W2 67 NaN NaN
2 W3 92 NaN NaN
3 W4 31 75.0 NaN
4 W5 90 NaN NaN
5 W6 100 53.0 NaN
6 W7 101 21.0 NaN
您可以做:
concated = pd.concat([df, df2, df3], sort=False).groupby('Week').first()
result = concated[concated.index.isin(('W1', 'W2', 'W3', 'W4', 'W5', 'W6', 'W7'))]
print(result)
输出
A B C
Week
W1 34.0 NaN NaN
W2 67.0 NaN NaN
W3 92.0 NaN NaN
W4 31.0 75.0 NaN
W5 90.0 NaN NaN
W6 100.0 53.0 NaN
W7 101.0 21.0 NaN