根据其他列值从数据框列中的列表中删除最后一个元素

Posted

技术标签:

【中文标题】根据其他列值从数据框列中的列表中删除最后一个元素【英文标题】:Delete last element from lists in column of data frame based on other column value 【发布时间】:2021-10-27 03:18:26 【问题描述】:

我有一个这样的数据框 df:

 col1  col2 col3               col4                col5      
  Type Key Date first found    Date last found     Images
0  A     1 2020-08-11 07:28:18 2020-08-11 07:28:18 ['image1', 'image2, 'image3']
1  A     2 2020-08-11 07:28:18 2020-08-12 07:28:18 ['image1', 'image2, 'image3']
2  B     3 2020-08-11 07:28:18 2020-08-13 07:28:18 ['image1', 'image2, 'image3']
3  B     4 2020-08-11 07:28:18 2020-08-13 07:28:18 ['image1', 'image2, 'image3']
4  C     5 2020-08-11 07:28:18 2020-08-13 07:28:18 ['image1', 'image2, 'image3']

如果类型为“A”,我想做的是删除最后一个元素“image3”。预期结果:

 col1  col2 col3               col4                col5      
  Type Key Date first found    Date last found     Images
0  A     1 2020-08-11 07:28:18 2020-08-11 07:28:18 ['image1', 'image2]
1  A     2 2020-08-11 07:28:18 2020-08-12 07:28:18 ['image1', 'image2]
2  B     3 2020-08-11 07:28:18 2020-08-13 07:28:18 ['image1', 'image2, 'image3']
3  B     4 2020-08-11 07:28:18 2020-08-13 07:28:18 ['image1', 'image2, 'image3']
4  C     5 2020-08-11 07:28:18 2020-08-13 07:28:18 ['image1', 'image2, 'image3']

我试过没有成功:

del df.loc[df["Type"] == 'A']['Images'][:-1]

df.loc[df["Type"] == 'A']['Images'] = df.loc[df["Type"] == 'A']['Images'].pop()

【问题讨论】:

【参考方案1】:

尝试使用str访问器:

df.loc[df["Type"] == 'A', 'Images'] = df['Images'].str[:-1]

【讨论】:

这是正确的方法,但我认为您不需要使用右侧的 loc:df.loc[df["Type"] == 'A', 'Images'] = df['Images'].str[:-1]。不确定这两个版本是否有速度优势。 @SimeonSimeonov 如果可行,请接受并投票 :)【参考方案2】:

为了速度最好的是两边都使用掩码(仅用于处理过滤的行,而不是像另一个答案那样处理所有行)并在变量中防止双重比较,因为 select 用于 str 与 iterables 一起使用,所以这里使用 @987654322 @s:

mask = df["Type"] == 'A'
df.loc[mask, 'Images'] = df.loc[mask, 'Images'].str[:-1]

【讨论】:

以上是关于根据其他列值从数据框列中的列表中删除最后一个元素的主要内容,如果未能解决你的问题,请参考以下文章

根据每个句子的第一个单词将 pandas 数据框列中的字符串列表分解为新列

循环遍历 pandas 数据框列中的列表元素以在新列中返回列表

从列表列表中提取元素并将其分配为熊猫数据框列中的值

不同数据框列中的 zip 列表元素

Pandas:如何将数据框列中的“时间戳”值从对象/字符串转换为时间戳?

检查列表中的单词并在 pandas 数据框列中删除这些单词