2017-03-25 4 views
6

Ich habe diese Daten in einem pandas.DataFrame:eine Liste von Pandas Datenrahmen Zeilenwerten aus mehreren Spalten machen

Date, Team1, Team2, Team1 Score, Team2 Score, Event 
8/2/17, Juventus, Milan, 2, 1, Friendly match 
6/2/17, Milan, Napoli, 3, 0, Friendly match 
5/1/17, Milan, Sampdoria, 1, 0, Friendly match 
25/12/16, Parma, Milan, 0, 5, Friendly match 

Wie ich eine Liste von Mailand machen kann erzielten Tore?

sollte die Ausgabe aussehen ::

[1, 3, 1, 5] 

Antwort

7

Sie numpy Arrays' boolean Indizierung verwenden können, bitte hier values verwenden, um ein 2D-numpy Array zu erhalten und boolean Indizierung verwenden, um die Werte zu erhalten, wo Team ist Milan:

df[["Team1 Score", "Team2 Score"]].values[df[["Team1", "Team2"]] == "Milan"] 
# array([1, 3, 1, 5]) 
+1

und allgemeiner mit 'Filter' Funktion;) – jezrael

4

Milano squadra mia

df['tmp1'] = df.loc[df.Team1 == 'Milan', 'Team1 Score'] 
df['tmp2'] = df.loc[df.Team2 == 'Milan', 'Team2 Score'] 
df['milazzo'] = df.tmp1.fillna(0) + df.tmp2.fillna(0) 
df.milazzo.tolist() 

In [73]: df.milazzo.tolist() 
Out[73]: [1.0, 3.0, 1.0, 5.0] 
5

Dadurch wird die Arbeit erledigt:

pd.concat([df["Team1 Score"][df.Team1=='Milan'],df["Team2 Score"][df.Team2=='Milan']]).sort_index().values.tolist() 

Der Ausgang ist [1, 3, 1, 5]

2

Sie können auch dann verwenden:

outlist = df[(df['Team1'] == 'Milan') | (df['Team2'] == 'Milan')].apply(
    lambda k: k['Team1 Score'] if k['Team1'] == 'Milan' else k['Team2 Score'], axis=1 
    ).tolist() 
2

Sie pandas.DataFrame.apply() mit einer Funktion können Sie ein Spiel für das Team in einer Spalte zurück.

Code:

def get_team_score(team): 
    def f(row): 
     if row.Team1 == team: 
      return row['Team1 Score'] 
     if row.Team2 == team: 
      return row['Team2 Score'] 

    return f 

Testcode:

from io import StringIO 

df = pd.read_csv(data) 
print(df) 
print(df.apply(get_team_score('Milan'), axis=1).values) 

Testdaten:

import pandas as pd 

data = StringIO(u"""Date,Team1,Team2,Team1 Score,Team2 Score,Event 
    8/2/17,Juventus,Milan,2,1,Friendly match 
    6/2/17,Milan,Napoli,3,0,Friendly match 
    5/1/17,Milan,Sampdoria,1,0,Friendly match 
    25/12/16,Parma,Milan,0,5,Friendly match 
""") 

Ergebnisse:

 Date  Team1  Team2 Team1 Score Team2 Score   Event 
0 8/2/17 Juventus  Milan   2   1 Friendly match 
1 6/2/17  Milan  Napoli   3   0 Friendly match 
2 5/1/17  Milan Sampdoria   1   0 Friendly match 
3 25/12/16  Parma  Milan   0   5 Friendly match 

[1 3 1 5] 
5
# slice df with just team columns and get values 
t = df[['Team1', 'Team2']].values 

# find the row and column slices where equal to 'Milan' 
i, j = np.where(t == 'Milan') 

# then slice the scores array with those positions 
s = df[['Team1 Score', 'Team2 Score']].values 

s[i, j] 

array([1, 3, 1, 5]) 

Ich kann dies weiter komprimieren, weil ich weiß, wo alle Spalten sind

v = df.values 
i, j = np.where(v[:, [1, 2]] == 'Milan') 
v[:, [3, 4]][i, j] 

array([1, 3, 1, 5]) 
Verwandte Themen