2016-11-20 1 views
2

Ich habe einen riesigen Datenrahmen. Ich versuche hier einen Multi-Index-Datenrahmen zu erstellen, der ihm ähnelt. Ich muss die Anzahl der NaN s basierend auf jedem Index und Spalte erhalten.Probleme mit der Arbeit mit Multi-Index-Datenrahmen

temp = pd.DataFrame({'tic': ['IBM', 'AAPL', 'AAPL', 'IBM', 'AAPL'], 
        'industry': ['A', 'B', 'B', 'A', 'B'], 
        'price': [np.nan, 5, 6, 11, np.nan], 
        'shares':[100, 60, np.nan, 100, 62], 
        'dates': pd.to_datetime(['1990-01-01', '1990-01-01','1990-04-01', 
               '1990-04-01', '1990-08-01']) 
        }) 

temp.set_index(['tic', 'dates'], inplace=True) 

, die ergibt:

   industry price shares 
tic dates        
IBM 1990-01-01  A NaN 100.0 
AAPL 1990-01-01  B 5.0 60.0 
    1990-04-01  B 6.0  NaN 
IBM 1990-04-01  A 11.0 100.0 
AAPL 1990-08-01  B NaN 62.0 

Hier sind die Themen:

1) Minor Frage: Warum ist der Index nicht funktioniert? Ich hatte erwartet, in der tic Spalte IBM und AAPL zu sehen.

2) Wie kann ich das Verhältnis von NaN s zu den gesamten Datenpunkten für jede tic auf jeder Spalte erhalten? Also, ich brauche einen Datenrahmen wie folgt aus:

tic          IBM    AAPL 
number of total NaNs     1    2 
percentage of NaNs in 'price' column 50%(1 out of 2) 33.3% (1 out 3) 
percentage of NaNs in 'Shares' column 0% (0 out 2)  33.3% (1 out 3) 

3) Wie kann ich die Tics Rang basierend auf deren Verhältnis von NaN s auf Spalte price?

4) Wie kann ich die oberen n Tics mit dem niedrigsten Verhältnis von NaN s auf beiden Spalten auswählen.

5) Wie kann ich das obige zwischen zwei Daten tun?

Antwort

2

1) Warum funktioniert der Index nicht?

temp.sort_index() 

enter image description here

2) Wie kann ich Verhältnis von NaNs?

grpd = temp.groupby(level='tic').agg(['size', 'count']) 

null_ratio = grpd.xs('count', axis=1, level=1) \ 
     .div(grpd.xs('size', axis=1, level=1)).mul(-1).__radd__(1) 

null_ratio 

enter image description here

3) Rang von Nullen in Preisspalte?

null_ratio.price.rank() 

tic 
AAPL 1.0 
IBM  2.0 
Name: price, dtype: float64 

4) Wie kann ich die oberen n Tics mit dem niedrigsten Verhältnis von NaNs auf beiden Säulen auswählen

null_ratio.price.nsmallest(1) 

tic 
AAPL 0.333333 
Name: price, dtype: float64 

5) zwischen Terminen

temp.sort_index().loc[pd.IndexSlice[:, '1990-01-01':'1990-04-01'], :] 

enter image description here

+0

Dank. Zu Nummer 4, das heißt mir geben nsmallest basierend auf nur Spalte 'price.' Wie kann ich die nsmallest auf beiden' price' und 'shares'? Dies sind die zwei wichtigsten Spalten. Ich multipliziere sie, um eine neue Spalte "Marktwert" zu erhalten. Also muss ich nur Tics behalten, die weniger als n% 'NaN' auf diesen beiden haben. – st19297

+0

@ st19297 wenn Sicherheit A eine Null-Ratio auf Kurs und Aktien von 0,1 bzw. 0,2 hatte und Sicherheit B hatte ein Null-Verhältnis von 0,09 und 0,21, wie Sie sie einstufen? Es klingt wie Sie etwas über Ihr Problem mehr zu denken. Oder verwende einen Filter. Sie haben es geschafft, 5 Fragen in einem zu stellen. Wenn Sie eine neue Frage haben, fragen Sie sie mit einem anderen Beitrag. wenn Sie für „Wie filtere ich auf zwei Spalten?“ Suche in der Tat, Ich bin mir sicher, dass es vorher gefragt und beantwortet wurde. – piRSquared

+0

Sie sind sehr richtig. Ich schätze Ihre Antwort. – st19297

2
  1. Sie die sort_level Funktion können Sie die gewünschte Reihenfolge erreichen.
    temp.sort_level('tic', inplace=True)
    temp.sort_level(['tic', 'dates'], inplace=True)

  2. df = pd.DataFrame({'total_missing': temp_grpd.apply(lambda x: x['price'].isnull().sum() + x['shares'].isnull().sum()), 'pnt_missing_price': temp_grpd.apply(lambda x: x['price'].isnull().sum()/x.shape[0]), 'pnt_missing_shares': temp_grpd.apply(lambda x: x['shares'].isnull().sum()/x.shape[0]), 'total_records': temp_grpd.apply(lambda x: x.shape[0])})

Wenn Sie es benötigen, können Sie die Datenrahmen umsetzen, das Format entsprechen, die Sie in Ihrem Beitrag enthalten, aber es wird wahrscheinlich einfacher sein, in diesem Format zu manipulieren .

  1. df['pnt_missing_price'].rank(ascending=False)

  2. Das Problem ist nicht gut definiert. Ich glaube, Sie wahrscheinlich so etwas wie die folgenden brauchen, aber es ist nicht klar.

    df['pnt_missing'] = df['total_missing']/df['total_records'] df.sort_values('pnt_missing', ascending=True) df.loc[df['pnt_missing'].nsmallest(5)]

  3. Sie bereits eine gute Antwort für diese eine von piRSquared haben.