【问题标题】:Pandas Group by before outer JoinPandas Group by before external Join
【发布时间】:2018-09-18 17:01:17
【问题描述】:

我有两个表格,格式如下:

表 1:键 = 日期、索引

    Date      Index  Value1
0   2015-01-01  A   -1.292040
1   2015-04-01  A   0.535893
2   2015-02-01  B   -1.779029
3   2015-06-01  B   1.129317   

表 2:键 = 日期

    Date        Value2
0   2015-01-01  2.637761
1   2015-02-01  -0.496927
2   2015-03-01  0.226914
3   2015-04-01  -2.010917
4   2015-05-01  -1.095533
5   2015-06-01  0.651244
6   2015-07-01  0.036592
7   2015-08-01  0.509352
8   2015-09-01  -0.682297
9   2015-10-01  1.231889
10  2015-11-01  -1.557481
11  2015-12-01  0.332942

Table2 有更多行,我想在 Date 上将 Table1 加入到 Table2 中,这样我就可以对值进行处理。但是,我也想引入索引并为每个索引填写,他们没有的所有日期都是这样的:

结果:

    Date    Index   Value1      Value2
0   2015-01-01  A   -1.292040   2.637761
1   2015-02-01  A   NaN         -0.496927
2   2015-03-01  A   NaN         0.226914
3   2015-04-01  A   0.535893    -2.010917
4   2015-05-01  A   NaN         -1.095533
5   2015-06-01  A   NaN         0.651244
6   2015-07-01  A   NaN         0.036592
7   2015-08-01  A   NaN         0.509352
8   2015-09-01  A   NaN         -0.682297
9   2015-10-01  A   NaN         1.231889
10  2015-11-01  A   NaN         -1.557481
11  2015-12-01  A   NaN         0.332942
.... and so on with Index B 

我想我可以手动将 Table1 中的每个索引值过滤到 Table2 中,但是如果我实际上并不知道所有索引,那将非常乏味和麻烦。我基本上想同时做一个“按索引分组的 Table1 并在日期右加入 Table2”,但我一直坚持如何表达这一点。

运行最新版本的 Pandas 和 Jupyter。

编辑:我有一个程序来填写 NaN,所以它们现在不是问题。

【问题讨论】:

  • 您能解释一下为什么在从表 1 连接到表 2 后 Value1 上有空值,但 Index 没有空值吗?是 Value1 在表 1 上具有空值但 Index 没有,还是在将 Index 值分配给表 2 上不存在于表 1 上的日期时是否有其他逻辑?
  • 如果不清楚,我深表歉意。结果表是我正在寻找并手动创建的示例。

标签: pandas join group-by


【解决方案1】:

您似乎想在'Date' 上将df1'Value1'df2 合并,同时将索引分配给每个日期。您可以将pd.concat 与列表理解一起使用

import pandas as pd

pd.concat([df2.assign(Index=i).merge(gp, how='left') for i, gp in df1.groupby('Index')],
          ignore_index=True)

输出:

          Date    Value2 Index    Value1
0   2015-01-01  2.637761     A -1.292040
1   2015-02-01 -0.496927     A       NaN
2   2015-03-01  0.226914     A       NaN
3   2015-04-01 -2.010917     A  0.535893
4   2015-05-01 -1.095533     A       NaN
5   2015-06-01  0.651244     A       NaN
6   2015-07-01  0.036592     A       NaN
7   2015-08-01  0.509352     A       NaN
8   2015-09-01 -0.682297     A       NaN
9   2015-10-01  1.231889     A       NaN
10  2015-11-01 -1.557481     A       NaN
11  2015-12-01  0.332942     A       NaN
12  2015-01-01  2.637761     B       NaN
13  2015-02-01 -0.496927     B -1.779029
14  2015-03-01  0.226914     B       NaN
15  2015-04-01 -2.010917     B       NaN
16  2015-05-01 -1.095533     B       NaN
17  2015-06-01  0.651244     B  1.129317
18  2015-07-01  0.036592     B       NaN
19  2015-08-01  0.509352     B       NaN
20  2015-09-01 -0.682297     B       NaN
21  2015-10-01  1.231889     B       NaN
22  2015-11-01 -1.557481     B       NaN
23  2015-12-01  0.332942     B       NaN

通过不指定合并键,它会自动使用列的交集,即每个组的['Date', 'Index']

【讨论】:

  • 这是一个非常简洁的列表理解。我没有你可以像那样拆分 groupby 对象。最后一件事,虽然很明显您没有遇到这个问题,但 Value1 并没有出现在我的 Jupyter 笔记本中。 groupby 正在工作,但合并正在起作用。你知道吗?
猜你喜欢
  • 2013-01-24
  • 1970-01-01
  • 1970-01-01
  • 2016-03-06
  • 2015-02-17
  • 2013-03-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多