2017-05-23 3 views
2

Hallo, ich bin neu in Python und ich versuche, meine Kenntnisse zu erhöhen, indem Sie eine nützliche Funktion. Ich versuche, eine Funktion zu erstellen, die eine Liste von 6 zufälligen Zahlen aus einer Reihe von Zahlen in einem Bereich von 1 bis 59 erstellt. Jetzt habe ich diesen Teil geknackt, es ist der nächste Teil, der schwierig ist. Ich möchte jetzt eine CSV-Datei für die Zahlen in der Zufallsauswahl überprüfen und dann eine Benachrichtigung ausdrucken, wenn zwei oder mehr Nummern aus dieser Menge gefunden werden. Nun habe ich versucht print (df[df[0:].isin(luckyDip)]) mit ein wenig Erfolg, dass es überprüft den Datenrahmen für die Zahlen in der Menge und zeigt dann die Zahlen, die im Datenrahmen übereinstimmen, aber es auch den Rest des Datenrahmens als NaN zeigen, das ist nicht sehr technisch ansprechend und nicht wirklich was ich will.Überprüfen Sie Daten aus einer Liste gegen eine CSV Python

Ich bin nur auf der Suche nach einigen Zeigern auf, was als nächstes zu tun oder nur, was zu suchen Google, ist der Code, mit dem ich herumgemacht habe.

import random 
import pandas as pd 

url ='https://www.national-lottery.co.uk/results/euromillions/draw-history/csv' 
df = pd.read_csv(url, sep=',', na_values=".") 

lottoNumbers = [1,2,3,4,5,6,7,8,9,10, 
      11,12,13,14,15,16,17,18,19,20, 
      21,22,23,24,25,26,27,28,29,30, 
      31,32,33,34,35,36,37,38,39,40, 
      41,42,43,44,45,46,47,48,49,50, 
      51,52,53,54,55,56,57,58,59] 
luckyDip = random.sample(lottoNumbers, k=6) #Picks 6 numbers at random 
print (sorted(luckyDip))  
print (df[df[0:].isin(luckyDip)]) 

Antwort

0

Wenn Sie schauen, nur um das Array zu glätten und entfernen nan Werten Sie diese bis zum Ende des Codes hinzufügen:

matches = df[df[0:].isin(luckyDip)].values.flatten().astype(np.float64) 
    print matches[~np.isnan(matches)] 
0

nicht so elegant wie @ayhan Lösung, aber das funktioniert:

import random 
import pandas as pd 

url ='https://www.national-lottery.co.uk/results/euromillions/draw-history/csv' 
df = pd.read_csv(url, index_col=0, sep=',') 

lottoNumbers = range(1, 60) 

tries = 0 
while True: 
    tries+=1 
    luckyDip = random.sample(lottoNumbers, k=6) #Picks 6 numbers at random 

    # subset of balls 
    draws = df.iloc[:,0:7] 

    # True where there is match 
    matches = draws.isin(luckyDip) 

    # Gives the sum of Trues 
    sum_of_trues = matches.sum(1) 

    # you are looking for matches where sum_of_trues is 6 
    final = sum_of_trues[sum_of_trues == 6] 
    if len(final) > 0: 
     print("Took", tries) 
     print(final) 
     break 

Das Ergebnis ist so etwas wie dieses:

Took 15545 
DrawDate 
16-May-2017 6 
dtype: int64 
0

Sie können zu dem hinzufügen, was Sie haben, indem Sie die notnull-Werte in jeder Zeile zählen. Dann zeigt die Zeilen, in denen die Spiele sind größer oder gleich 2.

match_count = df[df[0:].isin(luckyDip)].notnull().sum(axis=1) 
print(match_count[match_count >= 2]) 

Dies gibt Ihnen den Indexwert der passenden Zeile und die Anzahl der Spiele.

Beispiel Ausgabe:

6  2 
26 2 
40 3 
51 2 

Wenn Sie auch die passenden Werte aus diesen Zeilen möchten, können Sie hinzufügen:

index = match_count[match_count >= 2].index 
matches = [tuple(x[~pd.isnull(x)]) for x in df.loc[index][df[0:].isin(luckyDip)].values] 
print(matches) 

Beispiel Ausgabe:

[(19.0, 23.0), (19.0, 41.0), (19.0, 23.0, 34.0), (23.0, 28.0)] 
Verwandte Themen