私は2つのシリーズs1
とs2
パンダを持っていて、交点、つまりシリーズのすべての値が共通する場所を計算したいと考えています。
concat
これを行うには、関数をどのように使用しますか? s1
私はそれを解決しようとしましたが、できませんでした(とのインデックスではなく、値の交点を計算したくありませんs2
)。
私は2つのシリーズs1
とs2
パンダを持っていて、交点、つまりシリーズのすべての値が共通する場所を計算したいと考えています。
concat
これを行うには、関数をどのように使用しますか? s1
私はそれを解決しようとしましたが、できませんでした(とのインデックスではなく、値の交点を計算したくありませんs2
)。
両方のシリーズを Python のset コンテナーに配置してから、set 交差メソッドを使用します。
s1.intersection(s2)
必要に応じてリストに戻します。
タグにパンダが入っていることに気づきました。それに戻すことができます:
pd.Series(list(set(s1).intersection(set(s2))))
コメントから、これをより Pythonic な式に変更しました。これは短くて読みやすいです。
Series(list(set(s1) & set(s2)))
インデックスデータも重要な場合を除いて、トリックを行う必要があります。
list(...)
パンダはシリーズの直接入力としてセットを受け入れないため、pd.Series に移動する前にセットを変換するためにを追加しました。
設定:
s1 = pd.Series([4,5,6,20,42])
s2 = pd.Series([1,2,3,5,42])
タイミング:
%%timeit
pd.Series(list(set(s1).intersection(set(s2))))
10000 loops, best of 3: 57.7 µs per loop
%%timeit
pd.Series(np.intersect1d(s1,s2))
1000 loops, best of 3: 659 µs per loop
%%timeit
pd.Series(np.intersect1d(s1.values,s2.values))
10000 loops, best of 3: 64.7 µs per loop
values
したがって、numpy ソリューションは、明示的に使用する場合、小さなシリーズの場合でも set ソリューションに匹敵する可能性があります。
Pandas を使用している場合は、NumPy も使用していると思います。Numpy にはintersect1d
、Pandas シリーズで動作する機能があります。
例:
pd.Series(np.intersect1d(pd.Series([1,2,3,5,42]), pd.Series([4,5,6,20,42])))
値が 5 と 42 の Series を返します。
左と右のインクルージョンの両方をチェックすることによる別の解決策は次のとおりです
import pandas as pd
def intersect(left, right):
left, right = pd.Series(pd.unique(left)), pd.Series(pd.unique(right))
right = right.loc[right.isin(left)]
left = left.loc[left.isin(right)]
return pd.Series(pd.unique(left))
left = pd.Series([1,2,pd.NA, pd.NA, pd.NA], index=[*"abcde"], dtype="Int32")
right = pd.Series([pd.NA, pd.NA, 1, 3], index=[*"efgh"], dtype="Int32")
intersect(left, right)
これには 2 つの大きな利点があります。
pandas Int32およびその他の null 許容データ型で動作します。列に含まれている場合pd.NA
、np.intersect1d
エラーがスローされます!
パンダのdtypeをそのまま保持します