【问题标题】:next item of list inside dataframe数据框中的下一项列表
【发布时间】:2021-11-28 00:38:14
【问题描述】:

我有一个数据框,其中有一列,每行都有一个列表。 我想在我正在寻找的值之后获取下一个元素(在另一列中)。

例如: 假设我正在寻找“b”:

|lists    |next_element|
|---------|------------|
|[a,b,c,d]| c          | #(c is the next value after b)
|[c,b,a,e]| a          | #(a is the next value after b)
|[a,e,f,b]| []         | #(empty, because there is no next value after b)

*所有列表都有该元素。没有我正在寻找的价值的列表

谢谢

【问题讨论】:

  • 你自己尝试过什么?请分享您的代码并说明您对它的期望以及您得到了什么。

标签: python list dataframe filter


【解决方案1】:

尝试编写一个函数并使用apply

value = 'b'

def get_next(x):
    get_len = len(x)-1
    for i in x:
        if value.lower() == i.lower():
            curr_idx = x.index(i)
            if curr_idx == get_len:
                return []
            else:
                return x[curr_idx+1]

df["next_element"] = df["lists"].apply(get_next)
df
Out[649]: 
          lists next_element
0  [a, b, c, d]            c
1  [c, b, a, e]            a
2  [a, e, f, b]           []

【讨论】:

    【解决方案2】:

    首先观察,由于您想要字符串元素列表的下一个元素,因此预期的数据类型应该是该列的字符串,而不是列表。

    因此,最好使用 [c, a, None] 代替 next_element 列作为 [c, a, []]

    其次,您应该尝试避免将apply 方法直接应用于系列,而是使用pandas 为系列提供的str 方法,这是一种超级快速解决此类问题的矢量化方法。


    考虑到上述情况,让我们试试这个完全矢量化的单线 -

    element = 'b'
    
    df['next_element'] = df.lists.str.join('').str.split(element).str[-1].str[0]
    
              lists next_element
    0  [a, b, c, d]            c
    1  [c, b, a, e]            a
    2  [a, e, f, b]          NaN
    
    1. 首先我将每一行组合为一个字符串 [a,b,c,d]->'abcd`
    2. 接下来我将其除以 'b' 以获取子字符串
    3. 我使用在每一行上矢量化的str 函数从该列表中选择最后一个元素,最后为每一行选择第一个元素。

    在官方文档/教程here上阅读更多关于pandas.Series.str方法的信息

    【讨论】:

      【解决方案3】:
      df = df.assign(next_element = "")
      print(df)
      for ind in df.index:
          c= df["Lists"][ind]
          for i,v in enumerate(c):
              if v == "b":
                  df["next_element"][ind] = c[i+1]
                  
      print(df)
      

      试试这个,你会得到你所期望的准确输出。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-04
        • 2012-05-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多