Finden ersten wahren Wertes in einer Reihe von Pandas dataframe

Habe ich zwei dataframes von booleschen Werten.

Die erste sieht wie folgt aus:

b1=pd.DataFrame([[ True, False, False, False, False],
       [False, False,  True, False, False],
       [False,  True, False, False, False],
       [False, False, False, False, False]])

b1
Out[88]: 
       0      1      2      3      4
0   True  False  False  False  False
1  False  False   True  False  False
2  False   True  False  False  False
3  False  False  False  False  False

Wenn ich bin nur daran interessiert, ob jede Zeile hat den Wert True, die ich verwenden kann die any Methode:

b1.any(1)
Out[89]: 
0    True
1    True
2    True
3    False
dtype: bool

Allerdings möchte ich einen zusätzlichen Einschränkung, basierend auf einer zweiten dataframe, die wie folgt aussieht:

b2 = pd.DataFrame([[ True, False,  True, False, False],
       [False, False,  True,  True,  True],
       [ True,  True, False, False, False],
       [ True,  True,  True, False, False]])

b2
Out[91]: 
       0      1      2      3      4
0   True  False   True  False  False
1  False  False   True   True   True
2   True   True  False  False  False
3   True   True   True  False  False

Möchte ich, um Zeilen zu identifizieren, die einen True-Wert in der ersten dataframe NUR, wenn es das erste Wahre Wert in einer Zeile von der zweiten dataframe.

Beispielsweise das ausschließen würde, Zeile 2, da zwar es hat einen True-Wert in der ersten dataframe, es ist der 2. Wert true in der zweiten dataframe. Im Gegensatz dazu, Zeilen 1 und 2 haben einen true-Wert im dataframe 1, dass ist auch das erste wahre Wert in dataframe 2. Die Ausgabe soll folgende sein:

0    True
1    True
2    False
3    False
dtype: bool
InformationsquelleAutor AJG519 | 2017-05-13



3 Replies
  1. 7

    Eine Möglichkeit wäre die Nutzung von cumsum zu helfen, finden die ersten:

    In [123]: (b1 & b2 & (b2.cumsum(axis=1) == 1)).any(axis=1)
    Out[123]: 
    0     True
    1     True
    2    False
    3    False
    dtype: bool

    Dies funktioniert, weil b2.cumsum(axis=1) gibt uns die kumulative Anzahl von Wahrheiten gesehen, und Fällen, in denen Nummer 1 und b2 selbst Wahr ist, muss die erste sein.

    In [124]: b2.cumsum(axis=1)
    Out[124]: 
       0  1  2  3  4
    0  1  1  2  2  2
    1  0  0  1  2  3
    2  1  2  2  2  2
    3  1  2  3  3  3
  2. 1

    Als Variante zu @DSM kluge Antwort, dieser Ansatz schien ein wenig intuitiver zu mir. Der erste Teil sollte ziemlich selbsterklärend, und der zweite Teil findet man die erste Spalte mit der Nummer (w/axis = 1), dass gilt für jeden, dataframe und vergleicht.

    (b1.any(axis = 1) & (b1.idxmax(axis = 1) == b2.idxmax(axis = 1))
  3. 1

    Erarbeitet eine Lösung, die sich ähnlich pshep123 Lösung.

    # the part on the right of & is to check if the first True position in b1 matches the first True position in b2.
    
    b1.any(1) & (b1.values.argmax(axis=1) == b2.values.argmax(axis=1))
    Out[823]: 
    0     True
    1     True
    2    False
    3    False
    dtype: bool

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.