2016-04-12 16 views
6

Wie konvertiere ich einen Pandas DataFrame in Sparse Dictionary of Dictionaries, wo nur die Indizes von einigen Cutoff angezeigt werden. Im Spielzeug Beispiel unten, ich möchte nur Indizes für jede Spalte, deren Werte> 0Pandas Dataframe in spärlich Wörterbuch von Wörterbüchern

import pandas as pd 

table1 = [['gene_a', -1 , 1], ['gene_b', 1, 1],['gene_c', 0, -1]] 
df1 = pd.DataFrame(table) 
df1.columns = ['gene','cell_1', 'cell_2'] 
df1 = df1.set_index('gene') 
dfasdict = df1.to_dict(orient='dict') 

Das gibt:

dfasdict = {'cell_1': {'gene_a': -1, 'gene_b': 0, 'gene_c': 0}, 'cell_2': {'gene_a': 1, 'gene_b': -1, 'gene_c': -1}}

aber der gewünschte Ausgang ist eine spärliche Wörterbuch, in dem nur Werte von weniger als Null angezeigt:

desired = {'cell_1': {'gene_a': -1}, 'cell_2': {'gene_b': -1, 'gene_c': -1}}

ich einige Berechnungen durchführen können dieändernWörterbuch nach der Erstellung, aber ich möchte die Konvertierung im selben Schritt durchführen, da die Verarbeitung danach die Iteration über sehr große Wörterbücher umfasst. Ist es möglich, alles in Pandas zu tun?

+0

[Dies] (http://pandas.pydata.org/pandas-docs/stable/sparse.html) von Interesse sein sollte für dich. – ursan

Antwort

2

Dieses Ergebnis verwendet ein Wörterbuchverständnis, um das Ergebnis zu generieren. Für jede Spalte in cell_1 und cell_2 findet sie diejenigen, die kleiner als (lt) sind Null und konvertiert das Ergebnis in ein Wörterbuch.

>>> {col: df1.loc[df1[col].lt(0), col].to_dict() for col in ['cell_1', 'cell_2']} 
{'cell_1': {'gene_a': -1}, 'cell_2': {'gene_c': -1}} 

um zu verstehen, was hier los ist:

>>> df1.loc['cell_1'].lt(0) 
gene 
gene_a  True 
gene_b False 
gene_c False 
Name: cell_1, dtype: bool 

>>> df1.loc[df1['cell_1'].lt(0), 'cell_1'].to_dict() 
{'gene_a': -1} 
+0

Das funktioniert, aber die For-Schleife macht das sehr langsam. Ist es möglich, mithilfe von Masking und Aggregation nur die 'True'-Werte zu finden? –

1

Löschen Sie die letzte Zeile Ihres Codes und fügen Sie diesen hinzu.

from pandas import compat 

def to_dict_custom(data): 
    return dict((k, v[v<0].to_dict()) for k, v in compat.iteritems(data)) 

dfasdict = to_dict_custom(df1) 
print dfasdict 

, die

{'cell_2': {'gene_c': -1.0}, 'cell_1': {'gene_a': -1.0}} 

Linie 3 & 4 inspiriert von here überprüfen Sie bitte, ergibt.

Verwandte Themen