交织两个数据帧

piR*_*red 16 python numpy dataframe pandas

假设我有两个数据帧d1d2

d1 = pd.DataFrame(np.ones((3, 3), dtype=int), list('abc'), [0, 1, 2])
d2 = pd.DataFrame(np.zeros((3, 2), dtype=int), list('abc'), [3, 4])
Run Code Online (Sandbox Code Playgroud)
d1

   0  1  2
a  1  1  1
b  1  1  1
c  1  1  1
Run Code Online (Sandbox Code Playgroud)
d2

   3  4
a  0  0
b  0  0
c  0  0
Run Code Online (Sandbox Code Playgroud)

交织两个数据帧列的简单和通用方法是什么.我们可以假设列数d2总是比列数少一个d1.并且,指数是相同的.

我要这个:

pd.concat([d1[0], d2[3], d1[1], d2[4], d1[2]], axis=1)

   0  3  1  4  2
a  1  0  1  0  1
b  1  0  1  0  1
c  1  0  1  0  1
Run Code Online (Sandbox Code Playgroud)

roo*_*oot 15

使用pd.concat该DataFrames结合起来,并toolz.interleave重新排序列:

from toolz import interleave

pd.concat([d1, d2], axis=1)[list(interleave([d1, d2]))]
Run Code Online (Sandbox Code Playgroud)

结果输出符合预期:

   0  3  1  4  2
a  1  0  1  0  1
b  1  0  1  0  1
c  1  0  1  0  1
Run Code Online (Sandbox Code Playgroud)


Div*_*kar 6

这是一种NumPy方法 -

def numpy_interweave(d1, d2):
    c1 = list(d1.columns)
    c2 = list(d2.columns)
    N = (len(c1)+len(c2))
    cols = [None]*N
    cols[::2] = c1
    cols[1::2] = c2

    out_dtype = np.result_type(d1.values.dtype, d2.values.dtype)
    out = np.empty((d1.shape[0],N),dtype=out_dtype)
    out[:,::2] = d1.values
    out[:,1::2] = d2.values

    df_out = pd.DataFrame(out, columns=cols, index=d1.index)
    return df_out
Run Code Online (Sandbox Code Playgroud)

样品运行 -

In [346]: d1
Out[346]: 
   x  y  z
a  6  7  4
b  3  5  6
c  4  6  2

In [347]: d2
Out[347]: 
   p  q
a  4  2
b  7  7
c  7  2

In [348]: numpy_interweave(d1, d2)
Out[348]: 
   x  p  y  q  z
a  6  4  7  2  4
b  3  7  5  7  6
c  4  7  6  2  2
Run Code Online (Sandbox Code Playgroud)


cs9*_*s95 5

交织列:

c = np.empty((d1.columns.size + d2.columns.size,), dtype=object)
c[0::2], c[1::2] = d1.columns, d2.columns
Run Code Online (Sandbox Code Playgroud)

现在,使用布尔索引进行连接和重新排序:

d1.join(d2)[c]

   0  3  1  4  2
a  1  0  1  0  1
b  1  0  1  0  1
c  1  0  1  0  1
Run Code Online (Sandbox Code Playgroud)

pd.concat处理多个数据帧时,您可能更喜欢.