2017-03-05 5 views
0
import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt 

data = pd.read_csv('list.csv') 
print data 

Ich versuche, die Daten aus dieser Tabelle zu erhalten und den SpielenWie vergleicht man Elemente auf einem Datenrahmen auf Pandas?

Beispiel zählen https://i.stack.imgur.com/PMWay.png

Ich versuche auch Code für großen Datenrahmen zu optimieren, eine Filterung nur Tickets mit mehr als client:

double_tickets = data.TICKET.value_counts() > 1 
notas_slice = double_tickets[double_tickets == True] 
print notas_slice 

Ich begann jetzt auf Pandas und ich weiß nicht, wo ich mit diesem Problem anfangen soll.

EDIT:

Ich möchte die Vorfälle zwischen zwei Kunden zählen. Wie im Bildbeispiel (https://i.stack.imgur.com/PMWay.png) erschienen die Clients 14613 und 43733 in zwei TICKETS zur gleichen Zeit in zwei Fällen.

Antwort

1

Sie duplicated mit dem Parameter keep=False für die Rück Maske aller Duplikate verwenden - 2 und mehr TICKET Werte, Filter durch boolean indexing, wählen Sie dann durch loc Spalte Client und Werte erhalten, indem diese Maske:

print (df.TICKET.duplicated(keep=False)) 
0  False 
1  False 
2  True 
3  True 
4  True 
5  False 
6  True 
7  True 
8  False 
9  True 
10  True 
11  True 
12  True 
Name: TICKET, dtype: bool 

print (df.loc[df.TICKET.duplicated(keep=False), 'Client']) 
2  14613 
3  36735 
4  43733 
6  24456 
7  27919 
9  14613 
10 31725 
11 37547 
12 43733 
Name: Client, dtype: int64 

Dann value_counts und Filter durch boolean indexing ggf. Filter wieder:

s = df.loc[df.TICKET.duplicated(keep=False), 'Client'].value_counts() 
print (s) 
43733 2 
14613 2 
36735 1 
31725 1 
37547 1 
24456 1 
27919 1 
Name: Client, dtype: int64 

print (s[s > 1]) 
43733 2 
14613 2 
Name: Client, dtype: int64 

Last bei Bedarf Add reset_index für convert Series zu DataFrame:

df1 = s[s > 1].reset_index() 
df1.columns = ['Client','Count'] 
print (df1) 
    Client Count 
0 43733  2 
1 14613  2 

Lösung mit filtration ist slowier:

s = df.groupby('TICKET').filter(lambda x: len(x) > 1)['Client'].value_counts() 
print (s) 
43733 2 
14613 2 
36735 1 
31725 1 
37547 1 
24456 1 
27919 1 
Name: Client, dtype: int64 
In [46]: %timeit (df.loc[df.TICKET.duplicated(keep=False), 'Client'].value_counts()) 
1000 loops, best of 3: 769 µs per loop 

In [47]: %timeit (df.groupby('TICKET').filter(lambda x: len(x) > 1)['Client'].value_counts()) 
100 loops, best of 3: 2.55 ms per loop 

#[1300000 rows x 2 columns] 
df = pd.concat([df]*100000).reset_index(drop=True) 
#print (df) 

In [53]: %timeit (df.loc[df.TICKET.duplicated(keep=False), 'Client'].value_counts()) 
10 loops, best of 3: 54.8 ms per loop 

In [54]: %timeit (df.groupby('TICKET').filter(lambda x: len(x) > 1)['Client'].value_counts()) 
1 loop, best of 3: 282 ms per loop 
+0

Hummm .. In der Tat möchte ich die Vorfälle zwischen zwei Kunden zählen. Wie im Bildbeispiel (https://i.stack.imgur.com/PMWay.png) erschienen die Clients 14613 und 43733 in zwei TICKETS zur gleichen Zeit in zwei Fällen. – EnigmA

Verwandte Themen