【问题标题】:pandas complicated join operationpandas 复杂的join操作
【发布时间】:2016-11-17 18:37:55
【问题描述】:

我想实现具有以下要求的特定联接操作:

我有一个以下格式的数据框,其中索引是日期时间,我有从 0 到 N 的列(本例中为 9)

df1:

             0   1   2   3   4   5   6   7   8   9
2001-01-01   2  53  35  91  43  31   7  87  25  68
2001-01-02  12  97  86  59  51   7  75  25   6  40
2001-01-03  73  82  87   1  46  66  17  42  96  61

我还有另一个数据框,其中包含要为每个日期时间索引选择的列,即值是 0 到 N:

            0
2001-01-01  9
2001-01-02  5
2001-01-03  4

我想选择第一个数据帧的基础值,其中

index df1 = index df2
columns df1 = value df2

例如,上述示例的结果应如下所示:

join(df1,df2)=
            0
2001-01-01  68
2001-01-02  7
2001-01-03  46

【问题讨论】:

  • 那么,df2 中是否有一些日期索引可能是 df1 的一部分,反之亦然?如果是这样,那么所需的行为必须是什么?您能否针对这种情况发布一个示例案例?

标签: python pandas join merge


【解决方案1】:

你可以使用lookup:

print (df1.lookup(df1.index, df2.iloc[:,0]))
[68  7 46]

print (pd.DataFrame(df1.lookup(df1.index, df2.iloc[:,0]), index=df1.index))
             0
2001-01-01  68
2001-01-02   7
2001-01-03  46

squeeze 的另一个解决方案:

print (pd.DataFrame(df1.lookup(df1.index, df2.squeeze()), index=df1.index))
             0
2001-01-01  68
2001-01-02   7
2001-01-03  46

【讨论】:

  • 我认为这会更快,因为它避免了任何到数组的转换。很高兴看到 pandas 的 NumPy 替代方案可以进行如此精美的索引。
【解决方案2】:

这些内容取自 NumPy 的索引方法 -

vals = df1.values[np.arange(df1.shape[0]),df2[0].values]
df_out = pd.DataFrame(vals,index=df1.index)

【讨论】:

  • @motam79 还请查看@jezrael 的解决方案,因为这可能会更快。
猜你喜欢
  • 2014-01-05
  • 2020-05-01
  • 2015-09-13
  • 1970-01-01
  • 1970-01-01
  • 2015-11-23
  • 2022-01-13
  • 2016-01-04
  • 1970-01-01
相关资源
最近更新 更多