如何在Pandas中每n行将一个DataFrame插入另一个DataFrame?

4
例如,我有一个名为DataFrame A的数据框如下所示。
A
0
1
2

现在我想将DataFrame B中的每2行插入到A中的每1行中,其中B如下所示:

B
3
3
4
4
5
5

最后我希望

A
0
3
3
1
4
4
2
5
5

我该如何实现这个目标?

4个回答

6

一种方法是将每个数据帧的值进行重塑,使用np.hstack进行连接,然后赋值给新的数据帧。

In [533]: pd.DataFrame(np.hstack((df1.A.values.reshape(-1, 1),\
                                  df2.B.values.reshape(-1, 2))).reshape(-1, ),\
                       columns=['A'])
Out[533]: 
   A
0  0
1  3
2  3
3  1
4  4
5  4
6  2
7  5
8  5

使用 pd.concatdf.stack 的另一种解决方案:

In [622]: pd.DataFrame(pd.concat([df1.A, pd.DataFrame(df2.B.values.reshape(-1, 2))], axis=1)\
                             .stack().reset_index(drop=True),\
                      columns=['A'])
Out[622]: 
   A
0  0
1  3
2  3
3  1
4  4
5  4
6  2
7  5
8  5

@danche 你想要的是相当独特的。确实存在 pd.concat,但它无法随意交织系列。 - cs95
@Wen 这是可能的吗? - cs95
@Wen,我用df.stack和重置索引找到了一个解决方案。你是指这个吗? - cs95
如果你能分享,那将不胜感激~ - BENY
我在之前的评论中犯了一个错误,reset_index 不应该起作用。 - BENY
显示剩余6条评论

4

设置
考虑数据框 ab

a = pd.DataFrame(dict(A=range(3)))
b = pd.DataFrame(dict(B=np.arange(3).repeat(2) + 3))

解决方案
使用toolzcytoolzinterleave
技巧是将b分割为interleave的两个参数

from cytoolz import interleave

pd.Series(list(interleave([a.A, b.B[::2], b.B[1::2]])))

0    0
1    3
2    3
3    1
4    4
5    4
6    2
7    5
8    5
dtype: int64

这是对@root的答案的修改,针对我的问题


啊,又是cytoolz。 - cs95

2
也许是这个?
A=len(df1)+len(df2)
df1.index=(list(range(0, A,3)))
df2.index=list(set(range(0, A))-set(range(0, A,3)))
df2.columns=['A']
df=pd.concat([df1,df2],axis=0).sort_index()

df
Out[188]: 
   A
0  0
1  3
2  3
3  1
4  4
5  4
6  2
7  5
8  5

很好,有创意! - cs95
@cᴏʟᴅsᴘᴇᴇᴅ 谢谢您的回答~ 但它不够整洁,尽管如此您的答案仍然很好~ - BENY
好的回答 +1 (-: - piRSquared
@piRSquared 你的更好~ - BENY

0
如果我们首先将a分成len(a)个数组,将b分成len(b)个数组,然后将它们压缩在一起,堆叠并连接起来。
a = np.split(dfa.A.values,len(dfa.A))
b = np.split(dfb.B.values,len(dfb.B)/2)

c = np.concatenate(np.hstack(list(zip(a,b))))

pd.Series(c)

返回:

0    0
1    3
2    3
3    1
4    4
5    4
6    2
7    5
8    5
dtype: int64

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接