【问题标题】:Pandas, accessing every nth element in nested array熊猫,访问嵌套数组中的每个第 n 个元素
【发布时间】:2021-12-27 23:05:18
【问题描述】:

我有一个多行 4 列的数据框。每列包含一个包含 100 个值的数组。

我这样做的直观方式与使用多维 numpy 数组的方式相同。

例如,我想要column1 中每个数组的第一个元素。所以我说

df["column1"][:][0]

对我来说这是有道理的:首先选择列,然后获取每个数组,然后获取每个数组的第一个元素。

但是,它根本不起作用。相反,它只是从column1 第 1 行吐出整个数组。

但是 - 这是最令人沮丧的事情 - 如果我说:

df["column1"][1][0]

根据我的预期逻辑,它完全符合我的预期,例如,我在column1 的第二行中获得了数组中的第一个元素。

如何获取column1 中每个数组中的每个第 n 个元素?

【问题讨论】:

  • 如果它是一列列表(或元组),您可以df["column1"].str[0] 选择每个列表的第一个元素。但真的您可能需要考虑将数据存储在更扁平的二维数组中
  • 你的第一个选择不起作用的原因是因为df["column1"]选择了整个系列,然后[:]仍然选择了整个系列,所以它什么也没做,那么 Series[] 是基于标签的选择。所以整个切片所做的就是选择 Series,选择所有行,然后选择标记为 0 的行。
  • 并与您的第二个选择df["column1"][1][0] 进行比较,您选择整个系列,然后选择标记为1 的行,此时,给定一个非重复索引,您将存储的值在该单元格中,这是一个列表,因此您的最终选择会返回该列表的第 0 个元素。

标签: python arrays pandas dataframe pd


【解决方案1】:

df["column1"][:][0] 没有按照您的预期执行的原因是 df["column1"][:] 返回一个系列。对于系列,使用括号索引会返回该索引处的系列项目。

如果您想要一个系列,其中系列中的每个项目都是该索引处相应数组中的项目,正确的解决方案(无论是否直观)是在系列上使用 .str[...]

代替

df["column1"][:][0]

使用这个:

df["column1"].str[0]

看起来.str 应该只用于实际的str 值,但一个巧妙的技巧是也适用于列表。

【讨论】:

  • 谢谢!这确实有效!哈利路亚!在这样的事情上使用 .str 实在是太反直觉了。
【解决方案2】:

这里有一些方法可以做到这一点:

[item[0] for item in df['column1']]  # will result in a list

df['column1'].apply(lambda item: item[0])  # will result in a series

不确定您是否正在寻找类似于切片的方法,但 AFAIU pandas 认为您表中的列表只是任意对象,而不是 pandas 提供的糖。

当然,您可以通过在列中创建数据框来做其他花哨的事情:

pd.DataFrame(df['column1'].tolist())

然后用它做任何你想做的事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-07
    • 1970-01-01
    • 2021-10-05
    • 2014-01-20
    • 2020-07-21
    • 1970-01-01
    相关资源
    最近更新 更多