例如,我有一个DataFrame A
如下
A
0
1
2
现在我想将DataFrame B
中的每2行每1行插入A
,B
如下所示
B
3
3
4
4
5
5
最后我想要
A
0
3
3
1
4
4
2
5
5
我怎样才能做到这一点?
答案 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.concat
和df.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)
<强>设置强>
考虑数据框a
和b
a = pd.DataFrame(dict(A=range(3)))
b = pd.DataFrame(dict(B=np.arange(3).repeat(2) + 3))
<强>解决方案强>
使用interleave
或toolz
中的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
的修改
答案 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