Zoeken…


Syntaxis

  • Dataframe. samenvoegen ( rechts, how = 'inner', on = None, left_on = None, right_on = None, left_index = False, right_index = False, sort = False, suffixes = ('_ x', '_y'), copy = True, indicator = niet waar )

  • DataFrame-objecten samenvoegen door een joinbewerking in databasestijl uit te voeren met kolommen of indexen.

  • Als u kolommen op kolommen samenvoegt, worden de DataFrame-indexen genegeerd. Als u indexen op indexen of indexen op een kolom of kolommen samenvoegt, wordt de index doorgegeven.

parameters

parameters Uitleg
Rechtsaf dataframe
hoe {'left', 'right', 'outer', 'inner'}, standaard 'inner'
left_on label of lijst, of matrixachtig. Veldnamen om mee te doen in het linker DataFrame. Dit kan een vector of een lijst met vectoren met de lengte van het DataFrame zijn om een bepaalde vector te gebruiken als de toetssleutel in plaats van kolommen
right_on label of lijst, of matrixachtig. Veldnamen om mee te werken in het rechter DataFrame of vector / lijst met vectoren per left_on docs
left_index boolean, standaard False. Gebruik de index van het linker DataFrame als de toetssleutel (s). Als het een MultiIndex is, moet het aantal sleutels in het andere DataFrame (de index of een aantal kolommen) overeenkomen met het aantal niveaus
right_index boolean, standaard False. Gebruik de index van het juiste DataFrame als de toetssleutel. Dezelfde kanttekeningen als left_index
soort boolean, standaard Fals. Sorteer de toetssleutels lexicografisch in het resultaat DataFrame
achtervoegsels Reeks van 2 lengtes (tuple, lijst, ...). Achtervoegsel voor respectievelijk overlappende kolomnamen aan de linker- en rechterkant
kopiëren boolean, standaard True. Als het niet waar is, kopieer dan niet onnodig gegevens
indicator boolean of string, standaard False. Indien True, voegt een kolom toe aan output DataFrame met de naam "_merge" met informatie over de bron van elke rij. Als string, wordt kolom met informatie over de bron van elke rij toegevoegd aan output DataFrame en krijgt kolom de naam stringwaarde. De kolom Informatie is van het categorische type en neemt de waarde 'left_only' aan voor observaties waarvan de samenvoegcode alleen wordt weergegeven in 'left' DataFrame, 'right_only' voor observaties waarvan de samenvoegsleutel alleen wordt weergegeven in 'right' DataFrame, en 'beide' als de de samenvoegsleutel van observatie is in beide te vinden.

Samenvoegen

Er worden bijvoorbeeld twee tabellen gegeven,

T1

id    x        y
8    42        1.9
9    30        1.9

T2

id    signal
8    55
8    56    
8    59
9    57
9    58    
9    60

Het doel is om de nieuwe tafel T3 te krijgen:

id    x        y        s1        s2        s3
8    42        1.9        55        56        58
9    30        1.9        57        58        60

Dat is om kolommen s1 , s2 en s3 , die elk overeenkomen met een rij (het aantal rijen per id is altijd vast en gelijk aan 3)

Door join passen (waarvoor een optioneel argument nodig is dat een kolom of meerdere kolomnamen kan zijn, wat aangeeft dat het doorgegeven DataFrame moet worden uitgelijnd op die kolom in het DataFrame). Dus de oplossing kan zijn zoals hieronder getoond:

df = df1.merge (df2.groupby ('id') ['signal']. apply (lambda x: x.reset_index (drop = True)). unstack (). reset_index ())

df
Out[63]: 
   id   x    y   0   1   2
0   8  42  1.9  55  56  59
1   9  30  1.9  57  58  60

Als ik ze scheid:

df2t = df2.groupby('id')['signal'].apply(lambda x: x.reset_index(drop=True)).unstack().reset_index()

df2t
Out[59]: 
   id   0   1   2
0   8  55  56  59
1   9  57  58  60

df = df1.merge(df2t)

df
Out[61]: 
   id   x    y   0   1   2
0   8  42  1.9  55  56  59
1   9  30  1.9  57  58  60

Twee DataFrames samenvoegen

In [1]: df1 = pd.DataFrame({'x': [1, 2, 3], 'y': ['a', 'b', 'c']})

In [2]: df2 = pd.DataFrame({'y': ['b', 'c', 'd'], 'z': [4, 5, 6]})

In [3]: df1
Out[3]: 
   x  y
0  1  a
1  2  b
2  3  c   

In [4]: df2
Out[4]: 
   y  z
0  b  4
1  c  5
2  d  6

Innerlijke join:

Gebruikt het snijpunt van sleutels uit twee DataFrames.

In [5]: df1.merge(df2) # by default, it does an inner join on the common column(s)
Out[5]: 
   x  y  z
0  2  b  4
1  3  c  5

U kunt ook het snijpunt van sleutels van twee dataframes opgeven.

In [5]: merged_inner = pd.merge(left=df1, right=df2, left_on='y', right_on='y')
Out[5]: 
   x  y  z
0  2  b  4
1  3  c  5

Buitenste join:

Gebruikt de unie van de sleutels van twee DataFrames.

In [6]: df1.merge(df2, how='outer')
Out[6]: 
     x  y    z
0  1.0  a  NaN
1  2.0  b  4.0
2  3.0  c  5.0
3  NaN  d  6.0

Linker join:

Gebruikt alleen sleutels van het linker DataFrame.

In [7]: df1.merge(df2, how='left')
Out[7]: 
   x  y    z
0  1  a  NaN
1  2  b  4.0
2  3  c  5.0

Rechts meedoen

Gebruikt alleen sleutels van het juiste DataFrame.

In [8]: df1.merge(df2, how='right')
Out[8]: 
     x  y  z
0  2.0  b  4
1  3.0  c  5
2  NaN  d  6

Meerdere dataframes samenvoegen / samenvoegen / samenvoegen (horizontaal en verticaal)

voorbeeldframes genereren:

In [57]: df3 = pd.DataFrame({'col1':[211,212,213], 'col2': [221,222,223]})

In [58]: df1 = pd.DataFrame({'col1':[11,12,13], 'col2': [21,22,23]})

In [59]: df2 = pd.DataFrame({'col1':[111,112,113], 'col2': [121,122,123]})

In [60]: df3 = pd.DataFrame({'col1':[211,212,213], 'col2': [221,222,223]})

In [61]: df1
Out[61]:
   col1  col2
0    11    21
1    12    22
2    13    23

In [62]: df2
Out[62]:
   col1  col2
0   111   121
1   112   122
2   113   123

In [63]: df3
Out[63]:
   col1  col2
0   211   221
1   212   222
2   213   223

gegevensframes [df1, df2, df3] verticaal samenvoegen / samenvoegen / samenvoegen - rijen toevoegen

In [64]: pd.concat([df1,df2,df3], ignore_index=True)
Out[64]:
   col1  col2
0    11    21
1    12    22
2    13    23
3   111   121
4   112   122
5   113   123
6   211   221
7   212   222
8   213   223

gegevensframes horizontaal samenvoegen / samenvoegen / samenvoegen (uitlijnen op index):

In [65]: pd.concat([df1,df2,df3], axis=1)
Out[65]:
   col1  col2  col1  col2  col1  col2
0    11    21   111   121   211   221
1    12    22   112   122   212   222
2    13    23   113   123   213   223

Samenvoegen, meedoen en samenvoegen

Het samenvoegen van sleutelnamen is hetzelfde

pd.merge(df1, df2, on='key')

Het samenvoegen van sleutelnamen is anders

pd.merge(df1, df2, left_on='l_key', right_on='r_key')

Verschillende soorten verbindingen

pd.merge(df1, df2, on='key', how='left')

Meerdere toetsen samenvoegen

pd.merge(df1, df2, on=['key1', 'key2'])

Behandeling van overlappende kolommen

pd.merge(df1, df2, on='key', suffixes=('_left', '_right'))

Rijindex gebruiken in plaats van sleutels samenvoegen

pd.merge(df1, df2, right_index=True, left_index=True)

Vermijd het gebruik van .join syntaxis omdat dit een uitzondering vormt voor overlappende kolommen

Samenvoegen van linker dataframe-index en rechter dataframe-kolom

pd.merge(df1, df2, right_index=True, left_on='l_key')

Beknopte dataframes

Verticaal gelijmd

pd.concat([df1, df2, df3], axis=0)

Horizontaal gelijmd

pd.concat([df1, df2, df3], axis=1)

Wat is het verschil tussen samenvoegen en samenvoegen

Beschouw de dataframes left en right

left = pd.DataFrame([['a', 1], ['b', 2]], list('XY'), list('AB'))
left

   A  B
X  a  1
Y  b  2

right = pd.DataFrame([['a', 3], ['b', 4]], list('XY'), list('AC'))
right

   A  C
X  a  3
Y  b  4

join
Beschouw join als willen combineren met dataframes op basis van hun respectieve indexen. Als er overlappende kolommen zijn, wil join dat u een achtervoegsel toevoegt aan de overlappende kolomnaam uit het linker dataframe. Onze twee dataframes hebben een overlappende kolomnaam A

left.join(right, lsuffix='_')

  A_  B  A  C
X  a  1  a  3
Y  b  2  b  4

Merk op dat de index behouden blijft en we 4 kolommen hebben. 2 kolommen van left en 2 van right .

Als de indexen niet zijn uitgelijnd

left.join(right.reset_index(), lsuffix='_', how='outer')

    A_    B index    A    C
0  NaN  NaN     X    a  3.0
1  NaN  NaN     Y    b  4.0
X    a  1.0   NaN  NaN  NaN
Y    b  2.0   NaN  NaN  NaN

Ik gebruikte een buitenste voeg om het punt beter te illustreren. Als de indexen niet zijn uitgelijnd, is het resultaat de unie van de indexen.

We kunnen join vertellen om een specifieke kolom in het linker dataframe te gebruiken om als de join-sleutel te gebruiken, maar het zal nog steeds de index van rechts gebruiken.

left.reset_index().join(right, on='index', lsuffix='_')

  index A_  B  A  C
0     X  a  1  a  3
1     Y  b  2  b  4

merge
Zie merge als uitlijnen op kolommen. Standaard zal merge zoeken naar overlappende kolommen waarin kan worden samengevoegd. merge geeft betere controle over samenvoegtoetsen door de gebruiker in staat te stellen een subset van de overlappende kolommen te specificeren om te gebruiken met parameter on , of om afzonderlijk de specificatie toe te staan welke kolommen aan de linkerkant en welke kolommen aan de rechterkant samenvoegen.

merge retourneert een gecombineerd dataframe waarin de index wordt vernietigd.

Dit eenvoudige voorbeeld vindt de overlappende kolom 'A' en combineert op basis daarvan.

left.merge(right)

   A  B  C
0  a  1  3
1  b  2  4

Merk op dat de index [0, 1] en niet langer ['X', 'Y']

U kunt expliciet aangeven dat u samenvoegt op de index met de left_index of right_index paramter

left.merge(right, left_index=True, right_index=True, suffixes=['_', ''])

  A_  B  A  C
X  a  1  a  3
Y  b  2  b  4

En dit lijkt precies op het join voorbeeld hierboven.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow