2017-06-11 4 views
1

Ich arbeite an einer Datenbank mit Vorfällen, die verschiedene Sektoren in verschiedenen Ländern betreffen, und möchte eine Tabelle erstellen, die die Aufschlüsselung nach Vorfällen für jedes Land angibt.Häufigkeit, mit der bestimmte Zeichenfolgen in Python auftreten

Die Datenbank sieht wie folgt aus atm

Incident Name | Country Affected | Sector Affected 
incident_1  | US,TW,CN   | Engineering,Media 
incident_2  | FR,RU,CN   | Government 
etc., etc. 

Mein Ziel ein zu bauen wäre, die wie folgt aussieht:

Country | Engineering | Media | Government 
CN  | 3   | 0  | 5 
etc. 

Gerade jetzt meine Methode ist im Grunde ein zu verwenden, wenn Schleife zu überprüfen, ob Die Länderspalte enthält eine bestimmte Zeichenfolge (z. B. "CN"), und wenn dies True zurückgibt, führen Sie Counter von Sammlungen aus, um ein Wörterbuch der ursprünglichen Tabelle zu erstellen, und speichern Sie diese.

Mein Problem ist, wie skaliert man uns auf eine Ebene, wo es über die gesamte Datenbank ausgeführt werden kann UND wie man das von Counter produzierte Wörterbuch tatsächlich speichert.

+0

Würden Sie Ihren Beitrag bearbeiten, um zu zeigen, welchen Code Sie bisher haben? –

+0

Gibt es eine Möglichkeit, dass Ihre Datenbank geändert werden kann? (US, Engineering), (TW, Engineering), (CN, Engineering) usw. sollten alle separate Zeilen sein –

Antwort

0

pd.Series.str.get_dummies und pd.DataFrame.dot

c = df['Country Affected'].str.get_dummies(sep=',') 
s = df['Sector Affected'].str.get_dummies(sep=',') 

c.T.dot(s) 

    Engineering Government Media 
CN   1   1  1 
FR   0   1  0 
RU   0   1  0 
TW   1   0  1 
US   1   0  1 

größer Beispiel

np.random.seed([3,1415]) 

countries = ['CN', 'FR', 'RU', 'TW', 'US', 'UK', 'JP', 'AU', 'HK'] 
sectors = ['Engineering', 'Government', 'Media', 'Commodidty'] 

def pick_rnd(x): 
    i = np.random.randint(1, len(x)) 
    j = np.random.choice(x, i, False) 
    return ','.join(j) 

df = pd.DataFrame({ 
     'Country Affected': [pick_rnd(countries) for _ in range(10)], 
     'Sector Affected': [pick_rnd(sectors) for _ in range(10)] 
    }) 

df 

      Country Affected    Sector Affected 
0      CN    Government,Media 
1 FR,TW,JP,US,UK,CN,RU,AU   Commodidty,Government 
2     HK,AU,JP     Commodidty 
3   RU,CN,FR,JP,UK Media,Commodidty,Engineering 
4 CN,RU,FR,JP,TW,HK,US,UK Government,Media,Commodidty 
5     FR,CN     Commodidty 
6  FR,HK,JP,TW,US,AU,CN     Commodidty 
7 CN,HK,RU,TW,UK,US,FR,JP    Media,Commodidty 
8     JP,UK,AU    Engineering,Media 
9     RU,UK,FR       Media 

Dann

c = df['Country Affected'].str.get_dummies(sep=',') 
s = df['Sector Affected'].str.get_dummies(sep=',') 

c.T.dot(s) 

    Commodidty Engineering Government Media 
AU   3   1   1  1 
CN   6   1   3  4 
FR   6   1   2  4 
HK   4   0   1  2 
JP   6   2   2  4 
RU   4   1   2  4 
TW   4   0   2  2 
UK   4   2   2  5 
US   4   0   2  2 
+0

Das ist genial, ich kann dir nicht genug danken. Ich dachte, ich würde durch Tonnen von eingebetteten Schleifen gehen und es nur 2 Zeilen .... – Lublamai

+0

@Lublamai froh, ich könnte helfen. – piRSquared

Verwandte Themen