【发布时间】:2017-08-02 02:46:45
【问题描述】:
例如,我有一个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
我怎样才能做到这一点?
【问题讨论】:
例如,我有一个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
我怎样才能做到这一点?
【问题讨论】:
一种选择是获取每个数据框的值,重新整形,与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
【讨论】:
pd.concat,但不能任意交织系列。
reset_index
设置
考虑数据框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
这是将@root's answer 修改为my question
【讨论】:
也许这个?
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
【讨论】:
如果我们首先将 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
【讨论】: