2016-07-11 4 views
3

Ich habeWie man aus Datarahmen mit Pandas einzigartig wird?

df
2016-06-21 06:25:09 [email protected] GET HTTP/1.1 Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Version/7.0 Mobile/11D257 Safari/9537.53 200 application/json 2130 https://edge-chat.facebook.com/pull?channel=p_100006170407238&seq=27&clientid=1d67ca6e&profile=mobile&partition=-2&sticky_token=185&msgs_recv=27&qp=y&cb=1830997782&state=active&sticky_pool=frc3c09_chat-proxy&uid=100006170407238&viewer_uid=100006170407238&m_sess=&__dyn=1Z3p5wnE-4UpwDF3GAgy78qzoC6Erz8B0GxG9xu3Z0QwFzohxO3O2G2a1mwYxm48sxadwpVEy1qK78gwUx6&__req=79&__ajax__=AYlbtcBwGC2suZLI-J88V0PWa58vtQeG3YlQLydFRsAl6UwLSjsSpD7peu8mGl6NsHvd2zxfDcB6A0-XunBugUsYZ1lMYmUu97R43iV7XSfpyg&__user=100006170407238 
2016-06-22 06:25:20 [email protected] POST HTTP/1.1 Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Version/7.0 Mobile/11D257 Safari/9537.53 200 application/x-javascript 20248 https://m.facebook.com/stories.php?aftercursor=MTQ2NjY2MzEwNToxNDY2NjYzMTA1Ojg6NzM0ODg0MDExMjAyNDY1MzA5NToxNDY2NjYyNzk1OjA%3D&tab=h_nor&__m_log_async__=1 
2016-06-23 06:25:25 [email protected] CONNECT HTTP/1.1 Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Version/7.0 Mobile/11D257 Safari/9537.53 200 - 0 scontent.xx.fbcdn.net:443 
2016-06-23 06:25:25 [email protected] GET HTTP/1.1 Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Version/7.0 Mobile/11D257 Safari/9537.53 200 text/html 1105 https://m.facebook.com/xti.php?xt=2.qid.6299270070554694533%3Amf_story_key.343726573953754118%3Aei.AI%40ecf11fb3faf9c0b1f73ce2a74bc9f228 
2016-06-24 06:25:25 [email protected] CONNECT HTTP/1.1 Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Version/7.0 Mobile/11D257 Safari/9537.53 200 - 0 scontent.xx.fbcdn.net:443 
2016-06-25 06:25:25 [email protected] CONNECT HTTP/1.1 Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Version/7.0 Mobile/11D257 Safari/9537.53 200 - 0 scontent.xx.fbcdn.net:443 
2016-06-25 06:25:25 [email protected] CONNECT HTTP/1.1 Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Version/7.0 Mobile/11D257 Safari/9537.53 200 - 0 scontent.xx.fbcdn.net:443 

Ich muss jeden ID (nur für Jahr, Monat und Datum) einzigartig Datum zu erhalten. Wunsch Ausgabe:

[email protected] - 2016-06-21, 2016-06-22, 2016-06-23 
[email protected] - 2016-06-24, 2016-06-25 

Wie kann ich diesen Termin bekommen?

+0

Es ist nicht genug klar, was ist "df", etc. Geben Sie weitere Details. – peterh

+0

Das ist kein Datenrahmen, was hast du ausprobiert. – Merlin

Antwort

2

Sie können zuerst die Informationen, die Sie von Ihren Reisedaten benötigen extrahieren:

df['filtered date'] = [w[:10] for w in df['date']] 

Dann nutzen Sie ein ` drop duplicates ':

output = df[['id','filtered date']].drop_duplicates() 

Sie können dann Ihre Datenrahmen für Klarheit neu ordnen:

output.sort_values(by['id','filtered date'],inplace = True) 

Sie endlich diese Art der Ausgabe bekommen:

id    filtered date 
0 [email protected] 2016-06-24 
1 [email protected] 2016-06-25 
3 [email protected] 2016-06-21 
4 [email protected] 2016-06-22 
5 [email protected] 2016-06-23 
1

Pandas bietet die Funktion groupby für DataFrames, die für das, was Sie benötigen, geeignet sein sollte.

# Generate dataframe with random values 
mail = ['[email protected]', '[email protected]', '[email protected]'] 
stime = datetime.strptime('2016-07-01 00:00:00', '%Y-%m-%d %H:%M:%S') 
etime = datetime.strptime('2016-07-30 00:00:00', '%Y-%m-%d %H:%M:%S') 
tdelta = etime - stime 
tdiff = tdelta.days * 24 * 60 * 60 + tdelta.seconds 

df = pd.DataFrame({ 
    'mail': [choice(mail) for _ in range(10)], 
    'time':[stime + timedelta(seconds=randrange(tdiff)) for _ in range(10)] 
}) 

# Group dataframe by column 'mail' and apply the lambda expression to 
# transform the grouped set of values into unique time values. 
r = df.groupby(by='mail').apply(lambda x: set(x['time'].values)) 

Dann sollten Sie in der Lage sein, mit dem Ergebnis, arbeiten:

print(r) 

mail 
[email protected] {2016-07-24T16:42:12.000000000, 2016-07-07T15:... 
[email protected]  {2016-07-13T18:53:07.000000000, 2016-07-04T06:... 
[email protected]  {2016-07-10T07:37:19.000000000, 2016-07-09T07:... 
dtype: object 
1

Hier ist ein Einzeiler (date und ID als die Namen der Annahme, entsprechende Spalten)

df.groupby('ID').apply(lambda x: (x['date'].str[:10]).unique()) 

und sein Ausgang

ID 
[email protected]    [2016-06-24, 2016-06-25] 
[email protected] [2016-06-21, 2016-06-22, 2016-06-23] 
dtype: object 
1

Lassen Sie uns Ihre Beispieldaten in lauten:

import pandas as pd 
import StringIO 

df = pd.read_table(StringIO.StringIO("""2016-06-21 06:25:09 [email protected] GET HTTP/1.1 Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Version/7.0 Mobile/11D257 Safari/9537.53 200 application/json 2130 https://edge-chat.facebook.com/pull?channel=p_100006170407238&seq=27&clientid=1d67ca6e&profile=mobile&partition=-2&sticky_token=185&msgs_recv=27&qp=y&cb=1830997782&state=active&sticky_pool=frc3c09_chat-proxy&uid=100006170407238&viewer_uid=100006170407238&m_sess=&__dyn=1Z3p5wnE-4UpwDF3GAgy78qzoC6Erz8B0GxG9xu3Z0QwFzohxO3O2G2a1mwYxm48sxadwpVEy1qK78gwUx6&__req=79&__ajax__=AYlbtcBwGC2suZLI-J88V0PWa58vtQeG3YlQLydFRsAl6UwLSjsSpD7peu8mGl6NsHvd2zxfDcB6A0-XunBugUsYZ1lMYmUu97R43iV7XSfpyg&__user=100006170407238 
2016-06-22 06:25:20 [email protected] POST HTTP/1.1 Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Version/7.0 Mobile/11D257 Safari/9537.53 200 application/x-javascript 20248 https://m.facebook.com/stories.php?aftercursor=MTQ2NjY2MzEwNToxNDY2NjYzMTA1Ojg6NzM0ODg0MDExMjAyNDY1MzA5NToxNDY2NjYyNzk1OjA%3D&tab=h_nor&__m_log_async__=1 
2016-06-23 06:25:25 [email protected] CONNECT HTTP/1.1 Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Version/7.0 Mobile/11D257 Safari/9537.53 200 - 0 scontent.xx.fbcdn.net:443 
2016-06-23 06:25:25 [email protected] GET HTTP/1.1 Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Version/7.0 Mobile/11D257 Safari/9537.53 200 text/html 1105 https://m.facebook.com/xti.php?xt=2.qid.6299270070554694533%3Amf_story_key.343726573953754118%3Aei.AI%40ecf11fb3faf9c0b1f73ce2a74bc9f228 
2016-06-24 06:25:25 [email protected] CONNECT HTTP/1.1 Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Version/7.0 Mobile/11D257 Safari/9537.53 200 - 0 scontent.xx.fbcdn.net:443 
2016-06-25 06:25:25 [email protected] CONNECT HTTP/1.1 Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Version/7.0 Mobile/11D257 Safari/9537.53 200 - 0 scontent.xx.fbcdn.net:443 
2016-06-25 06:25:25 [email protected] CONNECT HTTP/1.1 Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Version/7.0 Mobile/11D257 Safari/9537.53 200 - 0 scontent.xx.fbcdn.net:443 
"""), delim_whitespace=True, header=None) 

Sie interessiert sind, in der ersten (Index: 0) Spalte, die Datum und die dritte ist (Index: 2), die E-Mail-Adr ist. Rein für die Sichtbarkeit Gründen wollen wir sie Rahmen in neuen Daten isolieren:

df2 = df[[0, 2]] 

die jetzt:

  0    2 
0 2016-06-21 [email protected] 
1 2016-06-22 [email protected] 
2 2016-06-23 [email protected] 
3 2016-06-23 [email protected] 
4 2016-06-24 [email protected] 
5 2016-06-25 [email protected] 
6 2016-06-25 [email protected] 

wir jetzt brauchen, um sie zu gruppieren und Aggregat mit benutzerdefinierten Funktion, die aggregierten Daten in Liste verwandeln (wie Sie die gewünschte Ausgabe):

df2.groupby(2).agg(lambda x: x.unique().tolist()).reset_index() 

reset_index() Fixes Indizierung so w folgenden Datenrahmen erhalten:

    2          0 
0 [email protected]    [2016-06-24, 2016-06-25] 
1 [email protected] [2016-06-21, 2016-06-22, 2016-06-23] 
Verwandte Themen