簡體   English   中英

如何根據條件編輯包含序列的 dataframe 列?

[英]How can I edit a dataframe column containing sequence based on the condition?

我有一個 dataframe 包含一個序列,其中包含編碼值和記錄它的日期(例如(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)]

有什么辦法可以寫一個 function 來得到這些結果? 任何幫助,將不勝感激。

如果第一個值在 X 或 Y 中,您可以在元組中的第一個索引(第二個項目)上檢查一個集合成員資格(對於此類用例來說非常快),如果第二個項目已經存在,則不會 append列表,然后將此 function 與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

您可以使用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)]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM