我要做的是选择每个单元格的第一个元素,而不管列数或行数(它们可能会根据用户定义的标准更改),并从数据中创建一个新的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
答案 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
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)