2016-07-30 34 views
0

Ich frage mich:
Suche nach bestimmten Zeichenfolge innerhalb einer Spalte und die Suche nach dem max zu dieser Zeichenfolge entspricht

1.), wie ich diese Zeichenfolge eine bestimmte Zeichenfolge in einer Spalte
2.) gegeben finden Sie, wie würde ich finde, es entspricht max
3.) Wie kann ich die Anzahl der Saiten für jede Zeile zählen in dieser Spalte

ich eine cSV-Datei mit dem Namen sports.csv

import pandas as pd 
import numpy as np 

#loading the data into data frame 
X = pd.read_csv('sports.csv') 

die beiden Spalten von Interesse sind die Totals und Gym Säule:

Total Gym 
40 Football|Baseball|Hockey|Running|Basketball|Swimming|Cycling|Volleyball|Tennis|Ballet 
37 Baseball|Tennis 
61 Basketball|Baseball|Ballet 
12 Swimming|Ballet|Cycling|Basketball|Volleyball|Hockey|Running|Tennis|Baseball|Football 
78 Swimming|Basketball 
29 Baseball|Tennis|Ballet|Cycling|Basketball|Football|Volleyball|Swimming 
31 Tennis 
54 Tennis|Football|Ballet|Cycling|Running|Swimming|Baseball|Basketball|Volleyball 
33 Baseball|Hockey|Swimming|Cycling 
17 Football|Hockey|Volleyball 

Beachten Sie, dass die Gym Spalte mehrere Strings für jede entsprechende sport.I'm versuchen, einen Weg zu finden, hat all die Fitness-Studios zu finden, die Baseball haben und finde den mit der maximalen Summe. Aber ich bin nur daran interessiert, in Fitness-Studios, die mindestens zwei andere Sportarten haben also würde ich nicht in Betracht ziehen:

Total Gym 
    37 Baseball|Tennis 
+0

Ist das tatsächlich, wie Sie Ihre Datei aussieht? –

+0

Ja, jede Sportart für diese Spalte ist durch ein "|" Symbol – M3105

+0

Ich sehe etwas Platz nach einem Pfeifen-Zeichen, das '| Schwimmen | Radfahren |', ist das auch in Ihrer Datei oder einem Tippfehler? –

Antwort

1

Sie können dies leicht tun pandas

Zuerst verwenden, teilen Sie die Zeichenfolgen in einer Liste auf der Registerkarte Trennzeichen, gefolgt von Iteration über die Liste und die, die mit der Länge von mehr als 2 wählen, wie Sie Baseball wollen würde zusammen mit zwei andere Sportarten als Kriterien.

In [4]: df['Gym'] = df['Gym'].str.split('|').apply(lambda x: ' '.join([i for i in x if len(x)>2])) 

In [5]: df 
Out[5]: 
    Total            Gym 
0  40 Football Baseball Hockey Running Basketball Sw... 
1  37             
2  61       Basketball Baseball Ballet 
3  12 Swimming Ballet Cycling Basketball Volleyball ... 
4  78             
5  29 Baseball Tennis Ballet Cycling Basketball Foot... 
6  31             
7  54 Tennis Football Ballet Cycling Running Swimmin... 
8  33     Baseball Hockey Swimming Cycling 
9  17       Football Hockey Volleyball 

str.contains Verwendung für die Zeichenfolge Baseball in der Spalte Gym zu suchen.

In [6]: df = df.loc[df['Gym'].str.contains('Baseball')] 

In [7]: df 
Out[7]: 
    Total            Gym 
0  40 Football Baseball Hockey Running Basketball Sw... 
2  61       Basketball Baseball Ballet 
3  12 Swimming Ballet Cycling Basketball Volleyball ... 
5  29 Baseball Tennis Ballet Cycling Basketball Foot... 
7  54 Tennis Football Ballet Cycling Running Swimmin... 
8  33     Baseball Hockey Swimming Cycling 

Berechnen Sie die jeweilige Anzahl der Strings.

In [8]: df['Count'] = df['Gym'].str.split().apply(lambda x: len([i for i in x])) 

gefolgt von der Teilmenge des Datenrahmen der Wahl auf den Maximalwert in der Spalte Totals entspricht.

In [9]: df.loc[df['Total'].idxmax()] 
Out[9]: 
Total       61 
Gym  Basketball Baseball Ballet 
Count        3 
Name: 2, dtype: object 
0

Sie können es in einem Durchgang tun, wie Sie die Datei lesen:

import csv 
with open("sport.csv") as f: 
    mx, best = float("-inf"), None 
    for row in csv.reader(f, delimiter=" ", skipinitialspace=1): 
     row[1:] = row[1].split("|") 
     if "Baseball" in row and len(row[1:]) > 2 and int(row[0]) > mx: 
      mx = int(row[0]) 
      best = row 
    if best: 
     print(best, mx, len(row[1:])) 

Was würde Ihnen:

(['61', 'Basketball', 'Baseball', 'Ballet'], 61, 3) 

Eine andere Möglichkeit, ohne Aufspaltung der Rohr Zeichen zu zählen wäre:

import csv 
with open("sports.csv") as f: 
    mx, best = float("-inf"),None 
    for row in csv.reader(f, delimiter=" ", skipinitialspace=1): 
     print(row[1]) 
     if "Baseball" in row[1] and row[1].count("|") > 1 and int(row[0]) > mx: 
      mx = int(row[0]) 
      best = row 
    if best: 
     print(best, mx, row[1].count("|")) 

Das bedeutet, obwohl eine Teilzeichenfolge möglicherweise im Gegensatz zu einem genauen Wort verglichen werden kann.

+0

Zuerst, danke für Ihre Antwort, ich schätze es sehr !!! Ich habe versucht, beide auszuführen, und es gab mir den folgenden Fehler: IndexError: Listenindex außerhalb des Bereichs – M3105

+0

Haben Sie leere Zeilen? –

+0

Nein, ich habe keine leeren Zeilen – M3105

0

Dieses Versuchen:

df3.loc[(df3['Gym'].str.contains('Hockey') == True) & (df3["Gym"].str.count("\|")>1)].sort_values("Total").tail(1) 

Total            Gym 
0  40 Football|Baseball|Hockey|Running|Basketball|Sw... 


df3.loc[(df3['Gym'].str.contains('Baseball') == True) & (df3["Gym"].str.count("\|")>1)].sort_values("Total").tail(1) 

    Total       Gym 
2  61 Basketball|Baseball|Ballet