[英]Using pd.concat to replicate pd.merge Pandas
假设我有 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'
(在本例中)function 使用 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 的数据,如果没有数据我只想要 NaN。
我被引导相信使用pd.concat
比pd.merge
,并且当我查看数百只股票时,这确实有助于减少构建我的df
所需的时间。 但是,日期应该完全匹配当然非常重要,因此我一直在 pd.merge 中使用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
任何帮助将不胜感激,干杯
编辑:
抱歉,只是为了澄清一下,我预期的 output 是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)
Output
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
我只是链接合并方法,因为它更简洁,并且除非您拥有大量数据,否则速度差异并不明显。
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.