用 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
我该如何继续解决这个问题?
在此先感谢您提供的任何帮助,我已经尝试了很多方法,我真的很难解决这个问题。
我承认这不是最好的解决方案,但至少它有效。假设较高和较矮的帧分别为f1
和f2
,则步长为
- 创建一个与
f1
高度相同但没有 cluster
列的“假”框架 f
。
- 用
f2
中的数据逐渐填充 f1
中的相关索引 f
。
- 将(部分填充的)
f
与 f1
连接起来
为了证明这个想法,假设两个框架是
>>> 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
代码如下(其中np
为numpy
)
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 循环中获得 idx1
和 idx2
,但我认为后者是最快的方法之一.
我目前遇到一个无法解决的问题。我花了 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
我该如何继续解决这个问题?
在此先感谢您提供的任何帮助,我已经尝试了很多方法,我真的很难解决这个问题。
我承认这不是最好的解决方案,但至少它有效。假设较高和较矮的帧分别为f1
和f2
,则步长为
- 创建一个与
f1
高度相同但没有cluster
列的“假”框架f
。 - 用
f2
中的数据逐渐填充f1
中的相关索引f
。 - 将(部分填充的)
f
与f1
连接起来
为了证明这个想法,假设两个框架是
>>> 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
代码如下(其中np
为numpy
)
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 循环中获得 idx1
和 idx2
,但我认为后者是最快的方法之一.