나는 당신이 계산 additions
하고 removals
동일한 적용 내에서 제안 할 것 입니다.
더 큰 예를 생성
import pandas as pd
import numpy as np
df = pd.DataFrame({'today': [['a', 'b', 'c'], ['a', 'b'], ['b']],
'yesterday': [['a', 'b'], ['a'], ['a']]})
df = pd.concat([df for i in range(10_000)], ignore_index=True)
당신의 솔루션
%%time
additions = df.apply(lambda row: np.setdiff1d(row.today, row.yesterday), axis=1)
removals = df.apply(lambda row: np.setdiff1d(row.yesterday, row.today), axis=1)
CPU times: user 10.9 s, sys: 29.8 ms, total: 11 s
Wall time: 11 s
단일 적용에 대한 솔루션
%%time
df["out"] = df.apply(lambda row: [np.setdiff1d(row.today, row.yesterday),
np.setdiff1d(row.yesterday, row.today)], axis=1)
df[['additions','removals']] = pd.DataFrame(df['out'].values.tolist(), columns=['additions','removals'])
df = df.drop("out", axis=1)
CPU times: user 4.97 s, sys: 16 ms, total: 4.99 s
Wall time: 4.99 s
사용 set
목록이 너무 크지 않으면 피할 수 있습니다 numpy
def fun(x):
a = list(set(x["today"]).difference(set(x["yesterday"])))
b = list((set(x["yesterday"])).difference(set(x["today"])))
return [a,b]
%%time
df["out"] = df.apply(fun, axis=1)
df[['additions','removals']] = pd.DataFrame(df['out'].values.tolist(), columns=['additions','removals'])
df = df.drop("out", axis=1)
CPU times: user 1.56 s, sys: 0 ns, total: 1.56 s
Wall time: 1.56 s
@ r.ook의 솔루션
출력 대신 목록 대신 세트를 사용하는 것이 행복하다면 @ r.ook의 코드를 사용할 수 있습니다
%%time
temp = df[['today', 'yesterday']].applymap(set)
removals = temp.diff(periods=1, axis=1).dropna(axis=1)
additions = temp.diff(periods=-1, axis=1).dropna(axis=1)
CPU times: user 93.1 ms, sys: 12 ms, total: 105 ms
Wall time: 104 ms
@Andreas K.의 솔루션
%%time
df['additions'] = (df['today'].apply(set) - df['yesterday'].apply(set))
df['removals'] = (df['yesterday'].apply(set) - df['today'].apply(set))
CPU times: user 161 ms, sys: 28.1 ms, total: 189 ms
Wall time: 187 ms
그리고 당신은 결국 .apply(list)
같은 출력을 얻기 위해 추가 할 수 있습니다