python—访问包含列表的dataframe列的每个第一个元素

ogq8wdun  于 2021-08-20  发布在  Java
关注(0)|答案(4)|浏览(287)

我有一个包含列表对象的列的数据框

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”的方法呢?

lmvvr0a8

lmvvr0a81#

你可以用 maplambda 功能

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

6g8kf2rb2#

和往常一样,请记住,在帧中存储非标量对象通常是不受欢迎的,实际上应该只作为临时的中间步骤使用。
也就是说,您可以使用 .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
db2dz4w8

db2dz4w83#

使用 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
4jb9z9bj

4jb9z9bj4#

您可以只使用一个条件列表,它接受任何iterable的第一个值,或者对该项不使用任何值。列表理解是非常抽象的。

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

相关问题