75

私は2つのシリーズs1s2パンダを持っていて、交点、つまりシリーズのすべての値が共通する場所を計算したいと考えています。

concatこれを行うには、関数をどのように使用しますか? s1私はそれを解決しようとしましたが、できませんでした(とのインデックスではなく、値の交点を計算したくありませんs2)。

4

6 に答える 6

85

両方のシリーズを Python のset コンテナーに配置してから、set 交差メソッドを使用します。

s1.intersection(s2)

必要に応じてリストに戻します。

タグにパンダが入っていることに気づきました。それに戻すことができます:

pd.Series(list(set(s1).intersection(set(s2))))

コメントから、これをより Pythonic な式に変更しました。これは短くて読みやすいです。

Series(list(set(s1) & set(s2)))

インデックスデータも重要な場合を除いて、トリックを行う必要があります。

list(...)パンダはシリーズの直接入力としてセットを受け入れないため、pd.Series に移動する前にセットを変換するためにを追加しました。

于 2013-08-06T12:05:28.283 に答える
46

設定:

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 ソリューションに匹敵する可能性があります。

于 2014-01-16T23:33:17.067 に答える
19

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 を返します。

于 2013-08-06T12:26:44.563 に答える
0

左と右のインクルージョンの両方をチェックすることによる別の解決策は次のとおりです

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.NAnp.intersect1dエラーがスローされます!

  • パンダのdtypeをそのまま保持します

于 2020-11-22T17:33:56.070 に答える