使用pd.concat复制pd.merge熊猫

问题描述 投票:0回答:1

假设我有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.concatpd.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
python pandas merge concatenation concat
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.