Python:将数组的多个列合并为一个的更简单方法

时间:2016-02-16 19:32:44

标签: python pandas

我有一个1996 * 9阵列:

array([[ 0.,  1.,  1., ...,  1.,  1.,  0.],
       [ 1.,  1.,  0., ...,  1.,  0.,  1.],
       [ 0.,  1.,  1., ...,  1.,  1.,  0.],
       ..., 
       [ 0.,  0.,  0., ...,  0.,  0.,  1.],
       [ 0.,  1.,  1., ...,  1.,  1.,  0.],
       [ 0.,  1.,  1., ...,  1.,  1.,  0.]])

我想要一个1996 * 1阵列。

我做了什么:

pd.DataFrame(train_L.astype(int)).apply(lambda x: ''.join(str(x)), axis = 1)

我得到了

0       0    0\n1    1\n2    1\n3    1\n4    1\n5    1...
1       0    1\n1    1\n2    0\n3    0\n4    0\n5    0...
2       0    0\n1    1\n2    1\n3    0\n4    1\n5    1...
3       0    0\n1    1\n2    1\n3    0\n4    1\n5    1...
4       0    1\n1    0\n2    0\n3    0\n4    0\n5    0...

问题:

  1. 我引入了一个额外的全零列。
  2. 介绍了\n1
  3. 转换类型太多次了。
  4. 我的问题: 没有这些警告,有没有一种简单的方法来进行合并?

    示例输出

    我有什么:

    v1 v2 v3 ... v9
    1  0  0  ... 1
    

    我想:

          v1
    1\t0\t0\t...\t1
    
    1. 列数减少到1
    2. 每个元素由\t分隔。
    3. 为什么我需要这种奇怪的形式:

      对于图像处理,我们有一列用于图像标签。但是,一个图像可能有多个标签。我必须将多个标签挤入1列。这是图书馆的要求。

2 个答案:

答案 0 :(得分:1)

将dtype转换为str:

后,您可以apply一个lambda
In [14]:

df = pd.DataFrame(np.random.randn(4,5))
df

Out[14]:
          0         1         2         3         4
0  1.036485 -1.243777  1.286254  1.973786 -0.083245
1  1.698828  1.696846  0.037732 -0.630546 -0.135069
2 -1.231337 -1.166480  0.046414 -0.965710  1.341809
3  0.591176  0.275267 -0.446553 -0.230353  0.258817

In [16]:
df.astype(str).apply(lambda x: ''.join(x), axis=1)

Out[16]:
0    1.03648484941-1.243776761241.286253591521.9737...
1    1.698827772721.696846119330.0377324485782-0.63...
2    -1.23133722226-1.166480155330.046414100678-0.9...
3    0.5911755605680.275266550205-0.446552705185-0....
dtype: object

您似乎想要一个只有join标签的标签:

In [17]:
df.astype(str).apply(lambda x: '\t'.join(x), axis=1)

Out[17]:
0    1.03648484941\t-1.24377676124\t1.28625359152\t...
1    1.69882777272\t1.69684611933\t0.0377324485782\...
2    -1.23133722226\t-1.16648015533\t0.046414100678...
3    0.591175560568\t0.275266550205\t-0.44655270518...
dtype: object

答案 1 :(得分:1)

这会产生一个字符串,这可能不是你想要的。也许你应该用你要求的格式解释你想要数据的原因。

a = np.array([[ 0.,  1.,  1., 1.,  1.,  0.],
              [ 1.,  1.,  0., 1.,  0.,  1.],
              [ 0.,  1.,  1., 1.,  1.,  0.],
              [ 0.,  0.,  0., 0.,  0.,  1.],
              [ 0.,  1.,  1., 1.,  1.,  0.],
              [ 0.,  1.,  1., 1.,  1.,  0.]])

v = pd.DataFrame(['\t'.join([str(val) for val in row]) for row in a], columns=['v1'])

for row in v.iterrows():
    print(row[1].v1)
0.0     1.0     1.0     1.0     1.0     0.0
1.0     1.0     0.0     1.0     0.0     1.0
0.0     1.0     1.0     1.0     1.0     0.0
0.0     0.0     0.0     0.0     0.0     1.0
0.0     1.0     1.0     1.0     1.0     0.0
0.0     1.0     1.0     1.0     1.0     0.0

>>> v
                             v1
0  0.0\t1.0\t1.0\t1.0\t1.0\t0.0
1  1.0\t1.0\t0.0\t1.0\t0.0\t1.0
2  0.0\t1.0\t1.0\t1.0\t1.0\t0.0
3  0.0\t0.0\t0.0\t0.0\t0.0\t1.0
4  0.0\t1.0\t1.0\t1.0\t1.0\t0.0
5  0.0\t1.0\t1.0\t1.0\t1.0\t0.0