我有一个Pandas DataFrame,其中一列包含列表对象
A
0 [1,2]
1 [3,4]
2 [8,9]
3 [2,6]
如何访问每个列表的第一个元素并将其保存到DataFrame的新列中?得到这样的结果:
A new_col
0 [1,2] 1
1 [3,4] 3
2 [8,9] 8
3 [2,6] 2
我知道这可以通过遍历每一行来完成,但是有没有" pythonic"办法?
答案 0 :(得分:12)
与往常一样,请记住,在帧中存储非标量对象通常是不受欢迎的,并且实际上只应用作临时中间步骤。
尽管如此,你可以使用.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
答案 1 :(得分:7)
您可以使用map
和lambda
功能
df.loc[:, 'new_col'] = df.A.map(lambda x: x[0])
答案 2 :(得分:4)
将apply
与x[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 :(得分:2)
您可以使用条件列表推导来获取任何可迭代的第一个值,或者对该项使用None。列表理解是非常Pythonic。
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
删除安全检查以确保可以进行互动。
%timeit df['new_col'] = [val[0] for val in df["A"]]
100 loops, best of 3: 7.38 ms per loop