2016-08-26 4 views
1

Es gibt 2 Spalte, Label1 und Label2. Beide sind Cluster-Labels mit unterschiedlichen Methoden.Bestimmen Sie den Spaltenwert basierend auf 2 anderen Spalten

Ich möchte das endgültige Cluster Label basierend auf diesen 2 Spalten erhalten. Verglichen mit jeder Zeile, solange eine dieser beiden Bezeichnungen identisch ist, befinden sie sich im selben Cluster.

Zum Beispiel: Zeile 0 und Zeile 1 haben Label 2 gemeinsam, Zeile 3 und Zeile 4 haben Label1 gemeinsam, also Row0 und Row1 in der gleichen Gruppe und Row3 und Row4 in der gleichen Gruppe. So die Ergebnisse Ich mag würde haben:

Label1 Label2 Cluster ID 
0 0 1024 0 
1 1 1024 0 
2 2 1025 1 
3 3 1026 2 
4 3 1027 2 
5 4 1028 3 

Was ist der beste Weg, dies zu tun Jede Hilfe würde geschätzt.

Bearbeitet: Ich denke, ich gab kein gutes Beispiel. Acutally, Etiketten sind nicht unbedingt in beliebiger Reihenfolge:

Label1 Label2 
0 0 1024 
1 1 1023 
2 2 1025 
3 3 1024 
4 3 1027 
5 4 1022 
+4

Könnten Sie bitte Postleitzahl für Ihren besten Versuch? Danke – lrnzcig

+0

Bitte überprüfen Sie diesen Link für weitere Hilfe - http://StackOverflow.com/Help/how-to-ask –

Antwort

2

Versuchen Sie Folgendes: Verwenden Sie np.wo und pandas.duplicated

df    = df.sort_values(['Label1', 'Label2']) 
df['Cluster'] = np.where((df.Label1.duplicated()) | (df.Label2.duplicated()),0,1).cumsum() 
print df 

     Label1 Label2 Cluster 
0  0 1024  1 
1  1 1024  1 
2  2 1025  2 
3  3 1026  3 
4  3 1027  3 
5  4 1028  4 
+0

Danke. Ich habe die Frage aktualisiert, mein Problem ist, dass die Etikettenspalte nicht monoton ist. Die gleiche Bezeichnung kann in Zeile1 und dann Zeile 100 erscheinen und sie sollten als dieselbe Gruppe gruppiert sein. Irgendwelche Vorschläge. – aidsj

+0

Ich habe es getestet, es hat sich auf Bestellung verlassen. Gegeben df = pd.DataFrame ( {'Label1': [0, 1, 2, 2, 1, 3], 'Label2': [1023, 1024, 1025, 1026, 1027, 1028]}). Ergebnisse: 1,2,3,3,3,4. Zeile 1 und Zeile 4 sollten jedoch in derselben Gruppe sein. Wie auch immer, Danke für deine Hilfe. – aidsj

+0

Ja, Sie sind richtig, behoben, cumsum Verwendung basiert auf Bestellung, viel Glück – Merlin

1

nicht sicher, ob ich verstanden habe deine Frage richtig, aber hier ist eine mögliche Art und Weise Cluster zu identifizieren:

import pandas as pd 
import collections 

df = pd.DataFrame(
    {'Label1': [0, 1, 2, 3, 3, 4], 'Label2': [1024, 1024, 1025, 1026, 1027, 1028]}) 
df['Cluster ID'] = [0] * 6 

counter1 = {k: v for k, v in collections.Counter(
    df['Label1']).iteritems() if v > 1} 
counter1 = counter1.keys() 
counter2 = {k: v for k, v in collections.Counter(
    df['Label2']).iteritems() if v > 1} 
counter2 = counter2.keys() 

len1 = len(counter1) 
len2 = len(counter2) 
index_cluster = len1 + len2 

for index, row in df.iterrows(): 
    if row['Label2'] in counter2: 
     df.loc[index, 'Cluster ID'] = counter2.index(row['Label2']) 
    elif row['Label1'] in counter1: 
     df.loc[index, 'Cluster ID'] = counter1.index(row['Label1']) + len2 
    else: 
     df.loc[index, 'Cluster ID'] = index_cluster 
     index_cluster += 1 

print df 
+0

Danke. Würdest du bitte ein wenig ausarbeiten? – aidsj

1

Hier ist, wie Sie dies umsetzen können:

  1. prüfen vorherige Zeile für denselben Wert für die beiden Spalten

  2. Wenn eine der beiden Werte gleich, sie erhöhen nicht Clusternummer und fügt Liste

  3. Wenn keiner der Werte clustern gleiche ist, die Anzahl Schritt Cluster und füge Liste

  4. hinzufügen Cluster-Liste als Spalte clustern zum Datenrahmen.

Code:

import pandas as pd 

df=pd.DataFrame([[0,1,2,3,4,5],[0,1,2,3,3,4],[1024,1024,1025,1026,1027,1028]]).T 
cluster_num = 0 
cluster_list = [] 
for i,row in df.iterrows(): 
    if i!=0: 
     # check previous row 
     if df.loc[i-1][1]==row[1] or df.loc[i-1][2]==row[2]: 
      # add to previous cluster 
      cluster_list.append(cluster_num) 
     else: 
      # create new cluster 
      cluster_num+=1 
      cluster_list.append(cluster_num) 
    else: 
     cluster_list.append(cluster_num) 

#Add the list as column 
df.insert(3,3,cluster_list) 
2

IIUC, könnten Sie die Cluster-Gruppe wie folgt:

man die Differenz zwischen der Reihe und es ist nächste Zeile, die oberste Zeile mit 0 füllen und es zu finden ist kumulative Summe für beide Labels [1 und 2].

Verknüpfung dieser Daten mit einem neuen Datenrahmen und Löschen der doppelten Werte getrennt für beide Labels [1 und 2]. Gefolgt von reset_index, um den Standard-Integer-Index zurückzubekommen.

In [4]: df_ = pd.concat([label1_, label2_], axis=1).drop_duplicates(['Label1']) \ 
                .drop_duplicates(['Label2'])  \ 
                .reset_index() 

Zuweisen der Indexwerte zu einer neuen Spalte, Cluster ID.

In [5]: df_['Cluster_ID'] = df_.index 

In [6]: df_.set_index('index', inplace=True) 

In [7]: df['Cluster_ID'] = df_['Cluster_ID'] 

Ersetzen Nan Werte mit ihm vorherigen endlichen Wert ist und als eine ganze Zahl, die endgültige Antwort zu werfen.

In [8]: df.fillna(method='ffill').astype(int) 
Out[8]: 
    Label1 Label2 Cluster_ID 
0  0 1024   0 
1  1 1024   0 
2  2 1025   1 
3  3 1026   2 
4  3 1027   2 
5  4 1028   3 
Verwandte Themen