Python:使用列中的数组展平
我有一个pandas数据帧,其中一列包含数组。我想通过为数组的每个元素重复其他列的值来“展平”它 我通过迭代每一行来构建一个临时值列表,成功地实现了这一点,但它使用的是“纯python”,而且速度很慢 有没有一种方法可以在pandas/numpy中实现这一点?换句话说,我尝试改进下面示例中的展平函数 非常感谢Python:使用列中的数组展平,python,arrays,performance,pandas,numpy,Python,Arrays,Performance,Pandas,Numpy,我有一个pandas数据帧,其中一列包含数组。我想通过为数组的每个元素重复其他列的值来“展平”它 我通过迭代每一行来构建一个临时值列表,成功地实现了这一点,但它使用的是“纯python”,而且速度很慢 有没有一种方法可以在pandas/numpy中实现这一点?换句话说,我尝试改进下面示例中的展平函数 非常感谢 toConvert = pd.DataFrame({ 'x': [1, 2], 'y': [10, 20], 'z': [(101, 102, 103), (201
toConvert = pd.DataFrame({
'x': [1, 2],
'y': [10, 20],
'z': [(101, 102, 103), (201, 202)]
})
def flatten(df):
tmp = []
def backend(r):
x = r['x']
y = r['y']
zz = r['z']
for z in zz:
tmp.append({'x': x, 'y': y, 'z': z})
df.apply(backend, axis=1)
return pd.DataFrame(tmp)
print(flatten(toConvert).to_string(index=False))
其中:
x y z
1 10 101
1 10 102
1 10 103
2 20 201
2 20 202
要创建列x
和y
,以及z
,您需要使用:
这是一个基于NumPy的解决方案-
np.column_stack((toConvert[['x','y']].values.\
repeat(map(len,toConvert.z),axis=0),np.hstack(toConvert.z)))
样本运行-
In [78]: toConvert
Out[78]:
x y z
0 1 10 (101, 102, 103)
1 2 20 (201, 202)
In [79]: np.column_stack((toConvert[['x','y']].values.\
...: repeat(map(len,toConvert.z),axis=0),np.hstack(toConvert.z)))
Out[79]:
array([[ 1, 10, 101],
[ 1, 10, 102],
[ 1, 10, 103],
[ 2, 20, 201],
[ 2, 20, 202]])
In [78]: toConvert
Out[78]:
x y z
0 1 10 (101, 102, 103)
1 2 20 (201, 202)
In [79]: np.column_stack((toConvert[['x','y']].values.\
...: repeat(map(len,toConvert.z),axis=0),np.hstack(toConvert.z)))
Out[79]:
array([[ 1, 10, 101],
[ 1, 10, 102],
[ 1, 10, 103],
[ 2, 20, 201],
[ 2, 20, 202]])