繁体   English   中英

使用 pd.concat 复制 pd.merge Pandas

[英]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.concatpd.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM