piR*_*red 16 python numpy dataframe pandas
假设我有两个数据帧d1和d2
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)
这是一种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)
交织列:
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处理多个数据帧时,您可能更喜欢.