[英]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.