Paarweise aus einem Pandas-Dataframe

Ich habe ein Pandas-Dataframe, das so aussieht:

  Al01 BBR60 CA07 NL219
 AAEAMEVAT MP NaN MP MP 
 AAFEDLRLL NaN NaN NaN NaN
 AAGAAVKGV NP NaN NP NP 
 ADRGLLRDI NaN NP NaN NaN 
 AEIMKICST PB1 NaN NaN PB1 
 AFDERRAGK NaN NaN NP NP 
 AFDERRAGK NP NaN NaN NaN

Es gibt tausend oder so Reihen und ein halbes Dutzend Säulen. Die meisten Zellen sind leer (NaN). Ich möchte wissen, was die Wahrscheinlichkeit des Textes in jeder Spalte ist, da eine andere Spalte Text darin hat. Zum Beispiel würde das kleine Snippet hier so etwas produzieren:

             Al01 BBR60 CA07 NL219
 Al01 4 0 2 3
 BBR60 0 1 0 0
 CA07 2 0 3 3
 NL219 3 0 3 4

Das heißt, es gibt 4 Treffer in der Al01-Säule; Von diesen 4 Hits, keine sind Treffer in der BBR60 Spalte, 2 sind auch Treffer in der CA07 Spalte, und 3 sind Treffer in der Spalte NL219. Und so weiter.

Ich kann durch jede Spalte treten und einen Dict mit den Werten bauen, aber das scheint ungeschickt zu sein. Gibt es einen einfacheren Ansatz?

  • Aufteilen einer csv-Datei in Panda-Dataframe durch mehrere Spalten
  • Trunkiere `TimeStamp` Spalte zu Stunden Präzision in Pandas` DataFrame`
  • Erstellung eigenständiger, aber kompositorischer "atomarer" Filterfunktionen für eine SQL Datenbank / Pandas Dataframe?
  • Mehrdimensionale / verschachtelte DataFrame in Pandas
  • Wie man die Korrelationsmatrix (mit p-Werten) eines Datenrahmens mit NaN-Werten effizient erhält?
  • Python Pandas Dataframe Append Zeilen
  • 2 Solutions collect form web for “Paarweise aus einem Pandas-Dataframe”

    Es ist nur Matrixmultiplikation:

    import pandas as pd df = pd.read_csv('data.csv',index_col=0, delim_whitespace=True) df2 = df.applymap(lambda x: int(not pd.isnull(x))) print df2.T.dot(df2) 

    Ausgabe:

      Al01 BBR60 CA07 NL219 Al01 4 0 2 3 BBR60 0 1 0 0 CA07 2 0 3 3 NL219 3 0 3 4 [4 rows x 4 columns] 

    Die Operation, die Sie durchführen, kann als eine Anwendung von np.einsum – es ist ein inneres Produkt zwischen jedem Paar von Säulen:

     import numpy as np import pandas as pd df = pd.read_table('data', sep='\s+') print(df) # Al01 BBR60 CA07 NL219 # 0 MP NaN MP MP # 1 NaN NaN NaN NaN # 2 NP NaN NP NP # 3 NaN NP NaN NaN # 4 PB1 NaN NaN PB1 # 5 NaN NaN NP NP # 6 NP NaN NaN NaN arr = (~df.isnull()).values.astype('int') print(arr) # [[1 0 1 1] # [0 0 0 0] # [1 0 1 1] # [0 1 0 0] # [1 0 0 1] # [0 0 1 1] # [1 0 0 0]] result = pd.DataFrame(np.einsum('ij,ik', arr, arr), columns=df.columns, index=df.columns) print(result) 

    Erträge

      Al01 BBR60 CA07 NL219 Al01 4 0 2 3 BBR60 0 1 0 0 CA07 2 0 3 3 NL219 3 0 3 4 

    Normalerweise, wenn eine Berechnung auf eine numerische Operation unabhängig von Indizes abläuft , ist es schneller, es mit NumPy zu tun als mit Pandas. Das scheint hier der Fall zu sein:

     In [130]: %timeit df2 = df.applymap(lambda x: int(not pd.isnull(x))); df2.T.dot(df2) 1000 loops, best of 3: 1.12 ms per loop In [132]: %timeit arr = (~df.isnull()).values.astype('int'); pd.DataFrame(np.einsum('ij,ik', arr, arr), columns=df.columns, index=df.columns) 10000 loops, best of 3: 132 µs per loop 
    Python ist die beste Programmiersprache der Welt.