wake-up-neo.com

ersetzen Sie Spaltenwerte in einem Datenrahmen durch Werte eines anderen Datenrahmens

Ich habe zwei Datenrahmen, der erste hat 1000 Zeilen und sieht folgendermaßen aus:

Date            Group         Family       Bonus
2011-06-09      tri23_1       Laavin       456
2011-07-09      hsgç_T2       Grendy       679
2011-09-10      bbbj-1Y_jn    Fantol       431
2011-11-02      hsgç_T2       Gondow       569

Die Spalte Group hat unterschiedliche Werte, die manchmal wiederholt werden, im Allgemeinen jedoch etwa 50 eindeutige Werte.

Der zweite Datenrahmen enthält alle diese 50 eindeutigen Werte (50 Zeilen) und auch die Hotels, die diesen Werten zugeordnet sind:

Group             Hotel
tri23_1           Jamel
hsgç_T2           Frank
bbbj-1Y_jn        Luxy
mlkl_781          Grand Hotel
vchs_94           Vancouver

Mein Ziel ist es, den Wert in der Spalte Group des ersten Datenrahmens durch die entsprechenden Werte der Spalte Hotel des zweiten Datenrahmens/zu ersetzen oder die Spalte Hotel mit den entsprechenden Werten zu erstellen. Wenn ich versuche es einfach durch Zuweisung zu machen 

df1.loc[(df1.Group=df2.Group), 'Hotel']=df2.Hotel

Ich habe den Fehler, dass die Datenrahmen nicht gleich groß sind, sodass der Vergleich nicht möglich ist

15
Amanda

Wenn Sie den Index auf die Spalte "Group" in der anderen Datenbank setzen, können Sie map in Ihrer ursprünglichen Spalte "Group" ersetzen:

In [36]:
df['Group'] = df['Group'].map(df1.set_index('Group')['Hotel'])
df

Out[36]:
         Date  Group  Family  Bonus
0  2011-06-09  Jamel  Laavin    456
1  2011-07-09  Frank  Grendy    679
2  2011-09-10   Luxy  Fantol    431
3  2011-11-02  Frank  Gondow    569
21
EdChum

Sie können auch ein Wörterbuch erstellen und "apply" verwenden:

hotel_dict = df2.set_index('Group').to_dict()
df1['Group'] = df1['Group'].apply(lambda x: hotel_dict[x])
1
Greg Friedman

verwenden Sie einfach Pandas-Join. Sie können auf den Detaillink verweisen: http://pandas.pydata.org/pandas-docs/stable/merging.html

df1.join(df2,on='Group')
1
176coding

Dies ist eine alte Frage, aber hier ist eine andere Möglichkeit, dies zu tun. Es ist nicht wie die pandas Weise, aber es ist schnell

Wiedergabe des Datenrahmens 1 - dieser soll aktualisiert werden

df_1

    Date    Group   Family  Bonus
0   2011-06-09  tri23_1     Laavin  456
1   2011-07-09  hsgç_T2     Grendy  679
2   2011-09-10  bbbj-1Y_jn  Fantol  431
3   2011-11-02  hsgç_T2     Gondow  569

Wiedergabe von DataFrame 2 - das Nachschlagen

df_2

    Group   Hotel
0   tri23_1     Jamel
1   hsgç_T2     Frank
2   bbbj-1Y_jn  Luxy
3   mlkl_781    Grand Hotel
4   vchs_94     Vancouver

Holen Sie sich die gesamte Hotel-ID (Schlüsselspalte) aus dem Datenrahmen 1 als Liste

key_list = list(df_1['Group'])

['tri23_1', 'hsgç_T2', 'bbbj-1Y_jn', 'hsgç_T2']

Erstellen Sie ein Wörterbuch aus dem Suchdatenrahmen, der die Schlüsselspalte und die Wertespalte enthält

dict_lookup = dict(Zip(df_2['Group'], df_2['Hotel']))

{'bbbj-1Y_jn': 'Luxy',
 'hsgç_T2': 'Frank',
 'mlkl_781': 'Grand Hotel',
 'tri23_1': 'Jamel',
 'vchs_94': 'Vancouver'}

Ersetzen Sie den Wert, indem Sie eine Liste erstellen, indem Sie den Wert nachschlagen und der Spalte von Datenrahmen 1 zuweisen

df_1['Group'] = [dict_lookup[item] for item in key_list]

Aktualisierter Datenrahmen 1

    Date    Group   Family  Bonus
0   2011-06-09  Jamel   Laavin  456
1   2011-07-09  Frank   Grendy  679
2   2011-09-10  Luxy    Fantol  431
3   2011-11-02  Frank   Gondow  569
0
vkt

Spalten in Pandas DataFrames sind nur Serien. Stellen Sie sicher, dass die DataFrames (oder DataFrame und Series (wie hier gezeigt)) denselben Index verwenden, sodass die Zuordnung von der Series zum DataFrame erfolgen kann:

**In:**

df = pd.DataFrame(data=
{'date': ['2011-06-09', '2011-07-09', '2011-09-10', '2011-11-02'], 
'family': ['Laavin', 'Grendy', 'Fantol', 'Gondow'], 
'bonus': ['456', '679', '431', '569']}, 
index=pd.Index(name='Group', data=['tri23_1', 'hsgç_T2', 'bbbj-1Y_jn', 'hsgç_T2']))

**Out:**
            date    family  bonus
Group           
tri23_1 2011-06-09  Laavin  456
hsgç_T2 2011-07-09  Grendy  679
bbbj-1Y_jn  2011-09-10  Fantol  431
hsgç_T2 2011-11-02  Gondow  569

**In:**

hotel_groups = pd.Series(['Jamel', 'Frank', 'Luxy', 'Grand Hotel', 'Vancouver'], 
index=pd.Index(name='Group', data=['tri23_1', 'hsgç_T2', 'bbbj-1Y_jn', 'mlkl_781', 'vchs_94']))

**Out:**

Group
tri23_1             Jamel
hsgç_T2             Frank
bbbj-1Y_jn           Luxy
mlkl_781      Grand Hotel
vchs_94         Vancouver
dtype: object

**In:**

df['hotel'] = hotel_groups

**Out:**

            date    family  bonus hotel
Group               
tri23_1 2011-06-09  Laavin  456 Jamel
hsgç_T2 2011-07-09  Grendy  679 Frank
bbbj-1Y_jn  2011-09-10  Fantol  431 Luxy
hsgç_T2 2011-11-02  Gondow  569 Frank

Beachten Sie, dass der Index für beide "Gruppe" ist, wodurch die Zuweisung möglich ist. 

Wenn Sie einer DataFrame-Spalte eine gleichindexierte Serie zuweisen, funktioniert die Zuweisung. Beachten Sie, dass dies funktioniert, obwohl in df doppelte Gruppenwerte vorhanden sind. Es würde nicht funktionieren, wenn doppelte Indexwerte (mit unterschiedlichen entsprechenden Datenwerten) in der Reihe hotel_groups vorhanden wären (z. B. wenn zwei Einträge für den Indexwert hsgc_T2 vorhanden wären, der erste mit dem Datenwert Frank und der zweite mit dem Datenwert Luxy) zugewiesen an df ['hotel'] (nicht, dass dies in Ihrem Beispiel jemals vorkommt) Dies funktioniert nicht, da es keinen Weg gibt, zu ermitteln, welchen Wert die gleich indizierte DataFrame-Spalte zuweisen soll. 

0