假设我有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
这很完美,如果没有数据,我只想查看W1-W7的数据。
我被认为使用pd.concat
比pd.merge
快得多,而且当我查看数百只股票时,这确实可以帮助减少构建我的{{1} }。但是,当然,日期必须完全匹配非常重要,因此为什么我一直在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
答案 0 :(得分:1)
您可以这样做:
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
答案 1 :(得分:0)
我只是链接合并方法,因为它更简洁并且除非有大量数据,否则速度差异不会明显。
df = df1.merge(df2, how='left').merge(df3, how='left')
print(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