Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 访问包含列表的DataFrame列的每个第一个元素_Python_Pandas_Dataframe - Fatal编程技术网

Python 访问包含列表的DataFrame列的每个第一个元素

Python 访问包含列表的DataFrame列的每个第一个元素,python,pandas,dataframe,Python,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”的方法呢 与x[0]一起使用: df

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

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

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

您可以使用
map
lambda
功能

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


一如既往,请记住,在帧中存储非标量对象通常是不受欢迎的,实际上只应作为临时中间步骤使用

也就是说,您可以使用
.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

您可以只使用一个条件列表,它接受任何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

这实际上只是暂时的,因为我对这些列中的字符串使用了“.split()”。谢谢你的快速帮助!我认为这是最优雅的解决方案,但对于长度为500万的系列,其中每个元素都只有一个包含2个元素的列表,.str[idx]方法耗时3.31秒,.apply(lambda x:x[idx])耗时1.43秒。这可能比via.apply()慢,但它处理NaN值的速度非常优雅(也就是说,它将NaN保留为NaN而不抛出错误)。在myy的情况下,代码的运行时间与您的解决方案最短。感谢您的帮助!但是如果您需要它来处理NaN值,还可以进一步查看DSM的回复。请注意
hasattr(…,“u iter_u_u”)
不是一个神奇的列表标识符,它也适用于字符串,例如
hasattr('hello','iter')
返回
True
,这可能不是您想要的。