Python 使用pd.concat复制pd.merge
假设我有3个df,如下所示:Python 使用pd.concat复制pd.merge,python,pandas,merge,concatenation,concat,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.Data
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 = pd.concat([df, df2], sort=True).groupby('Week').mean()
生成以下df:
这是完美的,我只想看到W1-W7的数据,如果没有数据,我只想要NaN
我相信使用pd.concat比pd.merge快得多,而且我正在研究数百种股票,这确实有助于缩短构建df所需的时间。当然,日期应该精确匹配是非常重要的,因此我一直在pd.merge中使用on=函数
到目前为止,我还不知道如何使用pd.concat复制这种行为。有人有什么建议吗?到目前为止,我尝试过的事情如下:
df = pd.merge(df, df2, on='Week', how='left')
df = pd.merge(df, df3, on='Week', how='left')
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
你可以做:
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)
输出
我只是将合并方法链接起来,因为它更简洁,除非您有大量数据,否则速度差异不会明显
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
那么你的预期输出是什么呢?嗨,伙计,公平点,刚刚编辑了这个问题,干杯,你为什么不连接df3?我只是想表明我目前所做的尝试不起作用,到目前为止,我只和康卡特玩过一次,没有得到任何结果。我不认为康卡特警长是这里的正确选择。嗨,伙计,这是一个非常好的答案,我会和它玩一玩thanks@topbantz很高兴我能帮忙!