Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用pd.concat复制pd.merge_Python_Pandas_Merge_Concatenation_Concat - Fatal编程技术网

Python 使用pd.concat复制pd.merge

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

假设我有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 = 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很高兴我能帮忙!