2017-09-15 4 views
0

Von dieser Frage Select column with only one negative value Ich versuche zu verwenden und ändern Sie die Lösung in eine Liste von Datenrahmen und wählen Sie die, die qualifiziert. Kann es aber nicht funktionieren lassen.Anwenden einer Operation auf eine Liste von Datenrahmen

Im folgenden Beispiel möchte ich den Datenrahmen zurückgeben, der nur einen negativen Wert oder weniger in Spalte 'Z' hat.

In diesem Fall df1.

Beispiel;

N = 5 

np.random.seed(0) 

df1 = pd.DataFrame(
     {'X':np.random.uniform(-3,3,N), 
      'Y':np.random.uniform(-3,3,N), 
      'Z':np.random.uniform(-3,3,N), 
       }) 

df2 = pd.DataFrame(
     {'X':np.random.uniform(-3,3,N), 
      'Y':np.random.uniform(-3,3,N), 
      'Z':np.random.uniform(-3,3,N), 
       }) 

      X   Y   Z 
0 0.292881 0.875365 1.750350 
1 1.291136 -0.374477 0.173370 
2 0.616580 2.350638 0.408267 
3 0.269299 2.781977 2.553580 
4 -0.458071 -0.699351 -2.573784 
---------------- 
      X   Y   Z 
0 -2.477224 2.871710 0.839526 
1 -2.878690 1.794951 -2.139880 
2 1.995719 -0.231124 2.668014 
3 1.668941 1.683175 0.131090 
4 2.220073 -2.290353 -0.512028 

Wie konnte ich das erreichen? Danke im Voraus.

+0

Nur um sicher zu gehen, dass Sie bei einer Liste von Datenrahmen 'list_of_df = [df1, df2]' nur die Datenfelder zurückgeben wollen, die in einer bestimmten Spalte einen oder weniger negative Werte haben? – bluesummers

+0

ja, das ist richtig – Zanshin

+0

Also, für die Probe nur zuerst df zurück? – Divakar

Antwort

5

Die Anzahl der Elemente unter 0 mit sum und nur yield zählen.

def foo(df_list): 
    for df in df_list: 
     if (df['Z'] < 0).sum(0) <= 1: 
      yield df 

df_list = [df1, df2] 
for df in foo(df_list): 
    print(df) 

      X   Y   Z 
0 0.292881 0.875365 1.750350 
1 1.291136 -0.374477 0.173370 
2 0.616580 2.350638 0.408267 
3 0.269299 2.781977 2.553580 
4 -0.458071 -0.699351 -2.573784 
+1

ich denke 'if (df ['Z'] <0) .sum (0) <= 1' !!!! Nur noch 4 Votes !!! – piRSquared

+0

@piRSquared Lol ... danke: D –

+0

4 Stimmen übrig? Hier ist eine . – Wen

0

Dies würde in Ihrem Fall

def func(dataframe_list, on_column): 

    returned_list = [] 
    for df in dataframe_list: 
     if (df[on_column] < 0).sum() <= 1: 
      returned_list.append(df) 

    return returned_list 

tun, rufen func([df1, df2], on_column='Z')

2

Sie könnten nur eine bedingte Liste Verständnis verwenden:

dfs = [df1, df2] 
>>> [df for df in dfs if df['Z'].lt(0).sum() <= 1] 
[   X   Y   Z 
0 0.292881 0.875365 1.750350 
1 1.291136 -0.374477 0.173370 
2 0.616580 2.350638 0.408267 
3 0.269299 2.781977 2.553580 
4 -0.458071 -0.699351 -2.573784] 

Das Ergebnis ist eine Liste jedes Datenrahmens, der Ihre Bedingung erfüllt.

Verwandte Themen