【问题标题】:How can I edit a dataframe column containing sequence based on the condition?如何根据条件编辑包含序列的数据框列?
【发布时间】:2021-07-11 01:23:51
【问题描述】:

我有一个数据框,其中包含一个序列,其中包含编码值和记录它的日期(例如 (A,1))。我的目标是检查编码值 X 和 Y。如果它们发生在同一天,请从序列中删除 Y 值。

ID     Sequence
1      [(A,1), (B,1), (X,2), (Y,2), (Y,3)]
2      [(C,1), (X,2), (Y,2), (Z,2)]
3      [(C,1), (D,2), (X,3), (Y,3),(Z,3)]

我期待的结果是:

ID     Sequence
1      [(A,1), (B,1), (X,2), (Y,3)] 
2      [(C,1), (X,2), (Z,2)]
3      [(C,1), (D,2), (X,3), (Z,3)]

有什么方法可以编写一个函数来获得这些结果吗?任何帮助将不胜感激。

【问题讨论】:

    标签: python python-3.x pandas list dataframe


    【解决方案1】:

    如果第一个值在 X 或 Y 中,如果第一个值在 X 或 Y 中,则可以在元组的第一个索引(第二项)上检查集合成员资格(对于此类用例来说非常快),如果第二个item 已经存在,它不会追加列表,然后将此函数与df.apply 一起使用

    def fun(l):
        s = set()
        lst = []
        for i in l:
            if i[0] in ('X','Y'):
                if i[1] not in s:
                    s.add(i[1])
                    lst.append(i)
            else:
                lst.append(i)
        return lst
    

    df['Sequence'].apply(fun) # df['Sequence']=df['Sequence'].apply(fun) assign back
    
    0    [(A, 1), (B, 1), (X, 2), (Y, 3)]
    1            [(C, 1), (X, 2), (Z, 2)]
    2    [(C, 1), (D, 2), (X, 3), (Z, 3)]
    Name: Sequence, dtype: object
    

    【讨论】:

      【解决方案2】:

      您可以使用itertools.groupby() 将同一天分组到同一组,然后过滤掉同一组中的Y

      最后使用itertools.chain() 来展平列表列表。

      import itertools
      
      def remove_y(lst):
          res = []
      
          for key, values in itertools.groupby(lst, key=lambda x: x[1]):
              values = list(values)
      
              if len(values) > 1:
                  res.append([value for value in values if not 'Y' in value])
              else:
                  res.append(values)
      
          return list(itertools.chain(*res))
      
      
      df['B'] = df['B'].apply(remove_y)
      
      # print(df)
      
         ID                                 B
      0   1  [(A, 1), (B, 1), (X, 2), (Y, 3)]
      1   2          [(C, 1), (X, 2), (Z, 2)]
      2   3  [(C, 1), (D, 2), (X, 3), (Z, 3)]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-24
        • 2021-10-03
        • 2023-03-24
        相关资源
        最近更新 更多