2017-09-20 10 views
8

Mam ramki danych tak:Jak przypisać liczbę unikatowych wartości do ewidencji w ramce danych w Pythonie

IP_address 
    IP1 
    IP1 
    IP1 
    IP4 
    IP4 
    IP4 
    IP4 
    IP4 
    IP7 
    IP7 
    IP7 

chciałbym wziąć liczbę unikatowych wartości w tej kolumnie i dodać licznik jako sama zmienna. Na koniec, powinno to wyglądać tak:

IP_address IP_address_Count 
    IP1    3 
    IP1    3 
    IP1    3 
    IP4    5 
    IP4    5 
    IP4    5 
    IP4    5 
    IP4    5 
    IP7    3 
    IP7    3 
    IP7    3 

Jestem w stanie podjąć unikalne wartości kolumny przy użyciu kodu poniżej:

unique_ip_address_count = (df_c_train.drop_duplicates().IP_address.value_counts()).to_dict() 

Jednak nie jestem pewien, w jaki sposób, aby dopasować je w pętli w python, dzięki czemu mogę uzyskać pożądane wyniki w python. Wszelka pomoc jest doceniana.

Nie mogę znaleźć równoważnej odpowiedzi w stackoverflow. Jeśli coś jest, proszę, skieruj mnie tam. Dziękuję Ci.

Odpowiedz

10

lub korzystając value_counts() z mapą

df['count'] = df['IP_address'].map(df['IP_address'].value_counts()) 


    IP_address count 
0 IP1   3 
1 IP1   3 
2 IP1   3 
3 IP4   5 
4 IP4   5 
5 IP4   5 
6 IP4   5 
7 IP4   5 
8 IP7   3 
9 IP7   3 
10 IP7   3 
+1

Lubię twoje rozwiązanie bardziej, w porównaniu do mojego ... :) – MaxU

+0

@Vaishali - Wielkie dzięki. To zadziałało. –

+0

@Vaishali - Mam jedno pytanie. Wynikowa wartość to wartość zmiennoprzecinkowa. Czy powinienem zrobić tutaj coś, aby przekonwertować na liczbę całkowitą, czy powinienem wziąć to jako oddzielny kod? –

6
In [75]: df['IP_address_Count'] = df.groupby('IP_address')['IP_address'].transform('size') 

In [76]: df 
Out[76]: 
    IP_address IP_address_Count 
0   IP1     3 
1   IP1     3 
2   IP1     3 
3   IP4     5 
4   IP4     5 
5   IP4     5 
6   IP4     5 
7   IP4     5 
8   IP7     3 
9   IP7     3 
10  IP7     3 
+0

dziękuję maksimum za poświęcenie czasu i udzielenie odpowiedzi. –

8

NumPy sposób -

tags, C = np.unique(df.IP_address, return_counts=1, return_inverse=1)[1:] 
df['IP_address_Count'] = C[tags] 

Próbka wyjściowa -

In [275]: df 
Out[275]: 
    IP_address IP_address_Count 
0   IP1     3 
1   IP1     3 
2   IP1     3 
3   IP4     5 
4   IP4     5 
5   IP4     5 
6   IP4     5 
7   IP4     5 
8   IP7     3 
9   IP7     3 
10  IP7     3 
1
ip_set = df.IP_address.unique() 
dict_temp = {} 
for ip in ip_set: 
    dict_temp[ip] = df[df.IP_address == ip].IP_address.value_counts()[0] 
df['counts'] = [dict_temp[ip] for ip in df.IP_address] 

T Jego wydaje się dać mi coś w rodzaju wyjścia, które pragną

EDIT: użycie Vaishali za mapy jest idealny

9

Korzystanie pd.factorize
To powinno być bardzo szybkie rozwiązanie, które skaluje dobrze dla dużych danych

f, u = pd.factorize(df.IP_address.values) 
df.assign(IP_address_Count=np.bincount(f)[f]) 

    IP_address IP_address_Count 
0   IP1     3 
1   IP1     3 
2   IP1     3 
3   IP4     5 
4   IP4     5 
5   IP4     5 
6   IP4     5 
7   IP4     5 
8   IP7     3 
9   IP7     3 
10  IP7     3 
+1

Tak, jest szybki. .. obecnie używam tej metody do zliczania unikatowych ;-) – Wen

Powiązane problemy