2016-05-09 84 views
1

我有包含列表的列的熊猫数据帧的每1元对象Accesing大熊猫数据框列包含列表

 A 
0 [1,2] 
1 [3,4] 
2 [8,9] 
3 [2,6] 

如何访问每个列表的第一个元素,并将其保存到的一个新列数据帧?为了得到这样

 A  new_col 
0 [1,2]  1 
1 [3,4]  3 
2 [8,9]  8 
3 [2,6]  2 

我知道这可能通过迭代在每一行做的结果,但没有任何“Python化”的方式?

回答

2

您可以使用maplambda功能

df.loc[:, 'new_col'] = df.A.map(lambda x: x[0]) 

+0

在myy的情况下,代码具有最短的运行时间和解决方案。谢谢您的帮助! – mkoala

1

使用applyx[0]

df['new_col'] = df.A.apply(lambda x: x[0]) 
print df 
     A new_col 
0 [1, 2]  1 
1 [3, 4]  3 
2 [8, 9]  8 
3 [2, 6]  2 
3

与往常一样,请记住,在帧存储非标对象一般是受不利,并且应该只能用作临时中间步骤。

这就是说,你可以使用.str访问,即使它不是一个字符串列:

>>> df = pd.DataFrame({"A": [[1,2],[3,4],[8,9],[2,6]]}) 
>>> df["new_col"] = df["A"].str[0] 
>>> df 
     A new_col 
0 [1, 2]  1 
1 [3, 4]  3 
2 [8, 9]  8 
3 [2, 6]  2 
>>> df["new_col"] 
0 1 
1 3 
2 8 
3 2 
Name: new_col, dtype: int64 
+0

这真的只是暂时的,因为我在这些列的字符串上使用了'.split()'。感谢您的快速帮助! – mkoala

1

你可以只使用条件列表理解这需要可迭代的第一个值或其他人使用无,该项目。列表理解是非常Python的。

df['new_col'] = [val[0] if hasattr(val, '__iter__') else None for val in df["A"]] 

>>> df 
     A new_col 
0 [1, 2]  1 
1 [3, 4]  3 
2 [8, 9]  8 
3 [2, 6]  2 

时序

df = pd.concat([df] * 10000) 

%timeit df['new_col'] = [val[0] if hasattr(val, '__iter__') else None for val in df["A"]] 
100 loops, best of 3: 13.2 ms per loop 

%timeit df["new_col"] = df["A"].str[0] 
100 loops, best of 3: 15.3 ms per loop 

%timeit df['new_col'] = df.A.apply(lambda x: x[0]) 
100 loops, best of 3: 12.1 ms per loop 

%timeit df.A.map(lambda x: x[0]) 
100 loops, best of 3: 11.1 ms per loop 

卸下安全检查,确保了interable。

%timeit df['new_col'] = [val[0] for val in df["A"]] 
100 loops, best of 3: 7.38 ms per loop