用 python 以这种特定方式连接 2 个数据帧的代码是什么

What is the code to concatenate 2 dataframes in this specific way with python

我目前遇到一个无法解决的问题。我花了 6 个小时试图找到解决方案,但最终对我没有任何帮助,可能是因为我没有使用 wright 的东西。 (我正在使用 python、pandas、numpy)

想象一下,我有 2 个相同的数据帧,除了第二个数据帧比每个集群的另一个数据帧少 5 天。其中“day”和“cluster”是已排序的列名。而且每个集群都有不同的天数。

图形情况是:https://i.stack.imgur.com/w8wDk.jpg

现在我想合并/连接的方式使我的数据框不根据索引合并。我希望第二个数据框的第一行与第一个数据框的第一行相匹配。因此,它将为合并后的第二个数据帧的最后 5 行引入 NA 值。

图形上的情况将是:https://i.stack.imgur.com/nFWHa.jpg

我该如何继续解决这个问题?

在此先感谢您提供的任何帮助,我已经尝试了很多方法,我真的很难解决这个问题。

我承认这不是最好的解决方案,但至少它有效。假设较高和较矮的帧分别为f1f2,则步长为

  1. 创建一个与 f1 高度相同但没有 cluster 列的“假”框架 f
  2. f2 中的数据逐渐填充 f1 中的相关索引 f
  3. 将(部分填充的)ff1
  4. 连接起来

为了证明这个想法,假设两个框架是

>>> f1
   cluster  day  A  B
0        2    0  1  2
1        2    1  3  4
2        1    2  5  6
3        1    3  7  8

>>> f2
   cluster  day   A   B
0        1    5  10  20
1        1    9  30  40
2        2    6  50  60

代码如下(其中npnumpy

f = f1.drop('cluster', axis=1).copy()   # the fake frame
f[:] = np.nan
f1g = f1.groupby('cluster')   # Allow for a second indexing way using cluster id
f2g = f2.groupby('cluster')

clusters1 = f1g.groups.keys()
clusters2 = f2g.groups.keys()
for cluster in (clusters1 & clusters2):
    idx1 = f1g.get_group(cluster).index   # indices of entries of the current cluster in f1
    idx2 = f2g.get_group(cluster).index   # indices of entries of the current cluster in f2
    m = len(idx2)
    f.loc[idx1[0:m]] = f2.loc[idx2[0:m], ['day', 'A', 'B']].to_numpy()   # fill the first m entries of current cluster in f with data from f2

以及连接假 f 和更高的 f1

后的结果
>>> pd.concat([f1, f], axis=1)
   cluster  day  A  B  day     A     B
0        2    0  1  2  6.0  50.0  60.0
1        2    1  3  4  NaN   NaN   NaN
2        1    2  5  6  5.0  10.0  20.0
3        1    3  7  8  9.0  30.0  40.0

最后说明:您可以使用 groupby 以外的方式在 for 循环中获得 idx1idx2,但我认为后者是最快的方法之一.