Python Pandas:在所有单元格中选择数组中的第一个元素

时间:2017-01-17 22:20:43

标签: arrays python-3.x pandas dataframe

我要做的是选择每个单元格的第一个元素,而不管列数或行数(它们可能会根据用户定义的标准更改),并从数据中创建一个新的pandas数据框。我的实际数据结构与我在下面列出的类似。

       0       1       2
0   [1, 2]  [2, 3]  [3, 6]
1   [4, 2]  [1, 4]  [4, 6]
2   [1, 2]  [2, 3]  [3, 6]
3   [4, 2]  [1, 4]  [4, 6]

我希望新数据框看起来像:

    0   1   2
0   1   2   3
1   4   1   4
2   1   2   3
3   4   1   4

下面的代码生成一个类似于我的数据集,并试图在我的代码中做我想做的事情而没有成功(d),并模仿我在类似问题中看到的成功(c;但是,只有一个柱)。这里有类似但不同的问题的链接:Python Pandas: selecting element in array column

import pandas as pd

zz = pd.DataFrame([[[1,2],[2,3],[3,6]],[[4,2],[1,4],[4,6]],
               [[1,2],[2,3],[3,6]],[[4,2],[1,4],[4,6]]])
print(zz)

x= zz.dtypes
print(x)

a = pd.DataFrame((zz.columns.values))
b = pd.DataFrame.transpose(a) 
c =zz[0].str[0] # this will give the 1st value for each cell in columns 0
d= zz[[b[0]].values].str[0] #attempt to get 1st value for each cell in all columns

3 个答案:

答案 0 :(得分:7)

您可以使用apply并选择列表使用indexing with str的第一个值:

print (zz.apply(lambda x: x.str[0]))
   0  1  2
0  1  2  3
1  4  1  4
2  1  2  3
3  4  1  4

stackunstack的另一种解决方案:

print (zz.stack().str[0].unstack())
   0  1  2
0  1  2  3
1  4  1  4
2  1  2  3
3  4  1  4

答案 1 :(得分:3)

我会使用applymap将相同的函数应用于DataFrame中的每个单元格

df.applymap(lambda x: x[0])

   0  1  2
0  1  2  3
1  4  1  4
2  1  2  3
3  4  1  4

答案 2 :(得分:1)

我是stack + unstack的粉丝 然而,@ jezrael已经把这个答案放下了...所以+ 1来自我。

那说,这是一个更快的方法。通过切割numpy数组

pd.DataFrame(
    np.array(zz.values.tolist())[:, :, 0],
    zz.index, zz.columns
)

   0  1  2
0  1  2  3
1  4  1  4
2  1  2  3
3  4  1  4

时间

enter image description here