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

时间:2019-10-29 15:28:11

标签: python pandas merge concatenation concat

假设我有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.concatpd.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

2 个答案:

答案 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