2017-11-21 2 views
3

Ich habe MxN numpy Array-Daten. Sie sind in der CSV-Datei und ich lese mit Pandas-Modul.Datenmanipulation mit Pandas Datenrahmen

sv-01 sv-02 SV-03 state-01 state-02 state-03 val-01 val-02 val-03 
7  12  8   B   B   B  .23  0.34 1.03 
7  12  8   B   B   A  .35  0.10 0 
7  12  8   B   A   A  1.45 0  0 
7  12  8   A   A   A  0  0  0 
7  12  8   A   B   B  0  1.23 3.21 

... ... ... ... ... .. .. ... ....

Für meine Berechnung Zweck brauche ich zwei Variablen. In jeder Zeile, wenn der Status A ist, würde der entsprechende Satellit nicht berücksichtigt. Also insgesamt SV in der ersten Zeile ist 3. In ähnlicher Weise 2,1,0,1 für andere Zeilen. Eine andere Variable ist die Anzahl der Zählungen. Wenn eine Zeile kein einzelnes B enthält, wird diese Zeile nicht gezählt. letzte Zeile würde als 2 betrachtet, da zwei B vorhanden sind.

#So my expected output is 
#Total count is 4 
#and number of satellites used is 3,2,1,0,1 in each row or iteration 

Wie kann ich meine Daten iterieren?

Dank

+0

Sollte die letzte Zeile als 2 gezählt werden? Zählen Sie # B in Zustandsspalten? – White

Antwort

2

Erste filter und vergleichen Sie alle Daten mit A, Summe True s und letzte subtrahieren B von rsub:

a = df.filter(like='state').eq('A').sum(axis=1).rsub(3) 
#same as 
#a = 3 - (df.filter(like='state') == 'A').sum(axis=1) 
print (a) 
0 3 
1 2 
2 1 
3 0 
4 2 
dtype: int64 

Detail:

print (df.filter(like='state')) 
    state-01 state-02 state-03 
0  B  B  B 
1  B  B  A 
2  B  A  A 
3  A  A  A 
4  A  B  B 

print (df.filter(like='state').eq('A')) 
    state-01 state-02 state-03 
0  False  False  False 
1  False  False  True 
2  False  True  True 
3  True  True  True 
4  True  False  False 

Für Zählung alle nicht A Reihen Verwenden Sie any für die Überprüfung mindestens einer True und sum:

b = df.filter(like='state').eq('A').any(1).sum() 
print (b) 
4 

print (df.filter(like='state').eq('A').any(1)) 
0 False 
1  True 
2  True 
3  True 
4  True 
dtype: bool 

Alle zusammen:

mask = df.filter(like='state').eq('A') 
a = mask.sum(axis=1).rsub(3) 
print (a) 
0 3 
1 2 
2 1 
3 0 
4 2 
dtype: int64 

b = mask.any(1).sum() 
print (b) 
4 
+0

@ jezrael Ich habe zwei Zweifel .1. was ist wie'. 2. Und wie man die Gesamtanzahl der Zählung berechnet. Darin ist es 4, weil in der 4. Reihe kein B ist. – Poka

+0

'like' bedeutet, dass man die Spalte nmaes nach' state' sucht. Und für Vergleich Nummer und dann zählen 'df.filter (like = 'state'). Eq (100) .sum (1)' – jezrael

+0

Ich füge Lösung für 'b' – jezrael