如何在Pandas的每第n行向n另一行插入n DataFrame?

时间:2017-08-02 02:46:46

标签: python pandas dataframe

例如,我有一个DataFrame A如下

A
0
1
2

现在我想将DataFrame B中的每2行每1行插入AB如下所示

B
3
3
4
4
5
5

最后我想要

A
0
3
3
1
4
4
2
5
5

我怎样才能做到这一点?

4 个答案:

答案 0 :(得分:5)

一种选择是获取每个数据帧的值,重新整形,与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

答案 1 :(得分:4)

<强>设置
考虑数据框ab

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

<强>解决方案
使用interleavetoolz中的cytoolz 诀窍是将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's answermy question

的修改

答案 2 :(得分: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

答案 3 :(得分:0)

如果我们先将一个数组拆分为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