在pandas列中提取列表的元素

Ign*_*sel 6 python python-3.x pandas

我有一个DataFrame,其中包含每列的列表,如下例所示,只有两列.

    Gamma   Beta
0   [1.4652917656926299, 0.9326935235505321, float] [91, 48.611034768515864, int]
1   [2.6008354611105995, 0.7608529935313189, float] [59, 42.38646954167245, int]
2   [2.6386970166722348, 0.9785848171888037, float] [89, 37.9011122659478, int]
3   [3.49336632573625, 1.0411524946972244, float]   [115, 36.211134224288344, int]
4   [2.193991200007534, 0.7955134305428825, float]  [128, 50.03563864975485, int]
5   [3.4574527664490997, 0.9399880977511021, float] [120, 41.841146628802875, int]
6   [3.1190582380554863, 1.0839109431114795, float] [148, 55.990072419824514, int]
7   [2.7757359940789916, 0.8889801332053203, float] [142, 51.08885697101243, int]
8   [3.23820908493237, 1.0587479742892683, float]   [183, 43.831293356668425, int]
9   [2.2509032790941985, 0.8896196407231622, float] [66, 35.9377662201882, int]
Run Code Online (Sandbox Code Playgroud)

我想为每一列提取每行列表的第一个位置,以获得如下的DataFrame.

    Gamma   Beta
0   1.4652917656926299  91
1   2.6008354611105995  59
2   2.6386970166722348  89
...
Run Code Online (Sandbox Code Playgroud)

到目前为止,我的解决方案就像是[row[1][0] for row in df_params.itertuples()],我可以迭代该行的每个列索引,然后组合我的新DataFrame.

另一种方法是new_df = df_params['Gamma'].apply(lambda x: x[0])迭代遍历所有列.

我的问题是,是否有一种不那么繁琐的方法来执行此操作?

Ian*_*anS 13

您可以使用str列表的访问者,例如:

df_params['Gamma'].str[0]
Run Code Online (Sandbox Code Playgroud)

这适用于所有列:

df_params.apply(lambda col: col.str[0])
Run Code Online (Sandbox Code Playgroud)

  • str[0] 拍得不错 ;) (4认同)
  • `str` 是一个将值视为字符串的访问器,对吗?是什么让这行得通? (3认同)
  • @Scro, `Series.str[0]` 调用 [`StringMethods.__getitem__`](https://github.com/pandas-dev/pandas/blob/4e8306690e8c29080c1886442ffd209c259bcd3d/pandas/core/strings/accessor.py#L240) ,当键不是切片时,它最终调用 [`_str_get`](https://github.com/pandas-dev/pandas/blob/4e8306690e8c29080c1886442ffd209c259bcd3d/pandas/core/strings/object_array.py#L267) 。`_str_get` 也是 `Series.str.get()` 的工作原理,该函数的文档称它可以“从列表、元组、字典或字符串中提取元素”。因此,“.str”访问器的一些(但不是全部)方法可以处理非字符串。 (2认同)