Ik heb gegevens in verschillende kolommen, maar ik weet niet hoe ik deze moet extraheren om ze in een andere variabele op te slaan.
index a b c
1 2 3 4
2 3 4 5
Hoe selecteer ik 'a'
, 'b'
en sla het op in df1?
Ik heb het geprobeerd
df1 = df['a':'b']
df1 = df.ix[:, 'a':'b']
Geen enkele lijkt te werken.
Antwoord 1, autoriteit 100%
De kolomnamen (die strings zijn) kunnen niet worden gesegmenteerd op de manier die u heeft geprobeerd.
Hier heb je een aantal opties. Als u uit de context weet welke variabelen u wilt uitsplitsen, kunt u een weergave van alleen die kolommen retourneren door een lijst door te geven aan de __getitem__
syntaxis(de []’s).
df1 = df[['a', 'b']]
Als het van belang is om ze numeriek te indexeren en niet op hun naam (stel dat uw code dit automatisch zou moeten doen zonder de namen van de eerste twee kolommen te kennen), dan kunt u dit in plaats daarvan doen:
df1 = df.iloc[:, 0:2] # Remember that Python does not slice inclusive of the ending index.
Bovendien moet u vertrouwd raken met het idee van een blik in een Pandas-object versus een kopie van dat object. De eerste van de bovenstaande methoden retourneert een nieuwe kopie in het geheugen van het gewenste subobject (de gewenste plakjes).
Soms zijn er echter indexeringsconventies in Panda’s die dit niet doen en u in plaats daarvan een nieuwe variabele geven die alleen verwijst naar hetzelfde stuk geheugen als het subobject of segment in het oorspronkelijke object. Dit gebeurt met de tweede manier van indexeren, dus je kunt deze aanpassen met de .copy()
methode om een normale kopie te krijgen. Wanneer dit gebeurt, kan het wijzigen van wat u denkt dat het gesegmenteerde object is, soms het oorspronkelijke object veranderen. Altijd goed om hier naar uit te kijken.
df1 = df.iloc[0, 0:2].copy() # To avoid the case where changing df1 also changes df
Om iloc
te gebruiken, moet u de kolomposities (of indices) weten. Aangezien de kolomposities kunnen veranderen, kunt u in plaats van hardcoderende indices de iloc
samen met de functie get_loc
van de methode columns
van het dataframe-object gebruiken om verkrijg kolomindexen.
{df.columns.get_loc(c): c for idx, c in enumerate(df.columns)}
Je kunt dit woordenboek nu gebruiken om toegang te krijgen tot kolommen via namen en met behulp van iloc
.
Antwoord 2, autoriteit 9%
Vanaf versie 0.11.0 kunnen kolommen wordengesegmenteerd op de manier die u probeerde met behulp van de .loc
indexer:
df.loc[:, 'C':'E']
is gelijk aan
df[['C', 'D', 'E']] # or df.loc[:, ['C', 'D', 'E']]
en retourneert de kolommen c
tot en met E
.
Een demo op een willekeurig gegenereerd DataFrame:
import pandas as pd
import numpy as np
np.random.seed(5)
df = pd.DataFrame(np.random.randint(100, size=(100, 6)),
columns=list('ABCDEF'),
index=['R{}'.format(i) for i in range(100)])
df.head()
Out:
A B C D E F
R0 99 78 61 16 73 8
R1 62 27 30 80 7 76
R2 15 53 80 27 44 77
R3 75 65 47 30 84 86
R4 18 9 41 62 1 82
Om de kolommen van C naar E te krijgen (merk op dat in tegenstelling tot integer slicing, ‘E’ is opgenomen in de kolommen):
df.loc[:, 'C':'E']
Out:
C D E
R0 61 16 73
R1 30 80 7
R2 80 27 44
R3 47 30 84
R4 41 62 1
R5 5 58 0
...
Hetzelfde werkt voor het selecteren van rijen op basis van labels. Haal de rijen ‘R6’ tot ‘R10’ uit die kolommen:
df.loc['R6':'R10', 'C':'E']
Out:
C D E
R6 51 27 31
R7 83 19 18
R8 11 67 65
R9 78 27 29
R10 7 16 94
.loc
accepteert ook een Booleaanse array, zodat je de kolommen kunt selecteren waarvan de corresponderende invoer in de array True
is. df.columns.isin(list('BCD'))
retourneert bijvoorbeeld array([False, True, True, True, False, False], dtype=bool)
– True als de kolomnaam in de lijst staat ['B', 'C', 'D']
; Onwaar, anders.
df.loc[:, df.columns.isin(list('BCD'))]
Out:
B C D
R0 78 61 16
R1 27 30 80
R2 53 80 27
R3 65 47 30
R4 9 41 62
R5 78 5 58
...
Antwoord 3, autoriteit 6%
Ervan uitgaande dat uw kolomnamen (df.columns
) ['index','a','b','c']
zijn, dan zijn de gewenste gegevens is in de
derde en vierde kolom. Als u hun namen niet weet wanneer uw script wordt uitgevoerd, kunt u dit doen
newdf = df[df.columns[2:4]] # Remember, Python is zero-offset! The "third" entry is at slot two.
Zoals EMS aangeeft in zijn antwoord, df.ix
snijdt kolommen iets beknopter, maar de .columns
slicing-interface kan natuurlijker zijn, omdat deze de vanille-eendimensionale Python-lijst-indexering/slicing-syntaxis gebruikt .
Waarschuwing: 'index'
is een slechte naam voor een DataFrame
-kolom. Datzelfde label wordt ook gebruikt voor het echte df.index
attribuut, een Index
array. Dus uw kolom wordt geretourneerd door df['index']
en de echte DataFrame-index wordt geretourneerd door df.index
. Een Index
is een speciaal soort Series
die is geoptimaliseerd voor het opzoeken van de waarden van de elementen. Voor df.index is het voor het opzoeken van rijen op hun label. Dat df.columns
-kenmerk is ook een pd.Index
-array, voor het opzoeken van kolommen aan de hand van hun labels.
Antwoord 4, autoriteit 4%
In de nieuwste versie van Panda’s is er een eenvoudige manier om precies dit te doen. Kolomnamen (dit zijn tekenreeksen) kunnenworden gesegmenteerd op elke gewenste manier.
columns = ['b', 'c']
df1 = pd.DataFrame(df, columns=columns)
Antwoord 5, autoriteit 3%
In [39]: df
Out[39]:
index a b c
0 1 2 3 4
1 2 3 4 5
In [40]: df1 = df[['b', 'c']]
In [41]: df1
Out[41]:
b c
0 3 4
1 4 5
Antwoord 6, autoriteit 2%
Met Panda’s,
met kolomnamen
dataframe[['column1','column2']]
om te selecteren op iloc en specifieke kolommen met indexnummer:
dataframe.iloc[:,[1,2]]
met loc kunnen kolomnamen worden gebruikt als
dataframe.loc[:,['column1','column2']]
Antwoord 7
U kunt een lijst met te verwijderen kolommen opgeven en het DataFrame terugsturen met alleen de benodigde kolommen met behulp van de functie drop()
op een Pandas DataFrame.
Gewoon zeggen
colsToDrop = ['a']
df.drop(colsToDrop, axis=1)
zou een DataFrame retourneren met alleen de kolommen b
en c
.
De drop
-methode is gedocumenteerd hier.
Antwoord 8
Ik vond deze methode erg handig:
# iloc[row slicing, column slicing]
surveys_df.iloc [0:3, 1:4]
Meer details vindt u hier.
Antwoord 9
Vanaf 0.21.0 wordt het gebruik van .loc
of []
met een lijst met een of meer ontbrekende labels afgeschaft ten gunste van .reindex
. Het antwoord op uw vraag is dus:
df1 = df.reindex(columns=['b','c'])
In eerdere versies zou het gebruik van .loc[list-of-labels]
werken zolang ten minste één van de sleutels werd gevonden (anders zou het een KeyError
). Dit gedrag is verouderd en geeft nu een waarschuwingsbericht weer. Het aanbevolen alternatief is om .reindex()
te gebruiken.
Lees meer op Indexeren en selecteren van gegevens.
Antwoord 10
U kunt de methode pandas.DataFrame.filter
gebruiken om kolommen als volgt te filteren of opnieuw te ordenen:
df1 = df.filter(['a', 'b'])
Dit is ook erg handig als je methoden aan het koppelen bent.
Antwoord 11
Je kunt panda’s gebruiken.
Ik maak het DataFrame:
import pandas as pd
df = pd.DataFrame([[1, 2,5], [5,4, 5], [7,7, 8], [7,6,9]],
index=['Jane', 'Peter','Alex','Ann'],
columns=['Test_1', 'Test_2', 'Test_3'])
Het DataFrame:
Test_1 Test_2 Test_3
Jane 1 2 5
Peter 5 4 5
Alex 7 7 8
Ann 7 6 9
Om een of meer kolommen op naam te selecteren:
df[['Test_1', 'Test_3']]
Test_1 Test_3
Jane 1 5
Peter 5 5
Alex 7 8
Ann 7 9
U kunt ook het volgende gebruiken:
df.Test_2
En je krijgt kolom Test_2
:
Jane 2
Peter 4
Alex 7
Ann 6
Je kunt ook kolommen en rijen uit deze rijen selecteren met .loc()
. Dit wordt “slicing”genoemd. Merk op dat ik van kolom Test_1
naar Test_3
:
df.loc[:, 'Test_1':'Test_3']
De “Plak” is:
Test_1 Test_2 Test_3
Jane 1 2 5
Peter 5 4 5
Alex 7 7 8
Ann 7 6 9
En als je gewoon Peter
en Ann
uit de kolommen Test_1
en Test_3
wilt:
df.loc[['Peter', 'Ann'], ['Test_1', 'Test_3']]
Je krijgt:
Test_1 Test_3
Peter 5 5
Ann 7 9
Antwoord 12
Als je één element per rij-index en kolomnaam wilt krijgen, kun je dat op dezelfde manier doen als df['b'][0]
. Het is zo eenvoudig als je je kunt voorstellen.
Of je kunt df.ix[0,'b']
gebruiken – gemengd gebruik van index en label.
Opmerking:Sinds v0.20 is ix
afgeschaft ten gunste van loc
/ iloc
.
Antwoord 13
Een andere en gemakkelijke aanpak: rijen herhalen
Iterows gebruiken
df1 = pd.DataFrame() # Creating an empty dataframe
for index,i in df.iterrows():
df1.loc[index, 'A'] = df.loc[index, 'A']
df1.loc[index, 'B'] = df.loc[index, 'B']
df1.head()
Antwoord 14
De verschillende benaderingen die in de vorige antwoorden zijn besproken, zijn gebaseerd op de veronderstelling dat de gebruiker kolomindexen kent om op te droppen of subsets op te zetten, of dat de gebruiker een dataframe wil subsetten met behulp van een reeks kolommen (bijvoorbeeld tussen ‘C’ : ‘E’).
pandas.DataFrame.drop()is zeker een optie om gegevens te subsetten op basis van een lijst met kolommen die door de gebruiker zijn gedefinieerd (hoewel u erop moet letten dat u altijd een kopie van het dataframe en inplaceparameters mogen niet worden ingesteld op True!!)
Een andere optie is om pandas.columns.difference()te gebruiken, wat een set verschil maakt voor kolomnamen, en een indextype array retourneert met de gewenste kolommen. Hier volgt de oplossing:
df = pd.DataFrame([[2,3,4], [3,4,5]], columns=['a','b','c'], index=[1,2])
columns_for_differencing = ['a']
df1 = df.copy()[df.columns.difference(columns_for_differencing)]
print(df1)
De uitvoer zou zijn:
b c
1 3 4
2 4 5
Antwoord 15
df[['a', 'b']] # Select all rows of 'a' and 'b'column
df.loc[0:10, ['a', 'b']] # Index 0 to 10 select column 'a' and 'b'
df.loc[0:10, 'a':'b'] # Index 0 to 10 select column 'a' to 'b'
df.iloc[0:10, 3:5] # Index 0 to 10 and column 3 to 5
df.iloc[3, 3:5] # Index 3 of column 3 to 5
Antwoord 16
U kunt ook df.pop gebruiken ():
>>> df = pd.DataFrame([('falcon', 'bird', 389.0),
... ('parrot', 'bird', 24.0),
... ('lion', 'mammal', 80.5),
... ('monkey', 'mammal', np.nan)],
... columns=('name', 'class', 'max_speed'))
>>> df
name class max_speed
0 falcon bird 389.0
1 parrot bird 24.0
2 lion mammal 80.5
3 monkey mammal
>>> df.pop('class')
0 bird
1 bird
2 mammal
3 mammal
Name: class, dtype: object
>>> df
name max_speed
0 falcon 389.0
1 parrot 24.0
2 lion 80.5
3 monkey NaN
Gebruik a.u.b. df.pop(c)
.
Antwoord 17
Probeer pandas.DataFrame.get
te gebruiken (zie de documentatie):
import pandas as pd
import numpy as np
dates = pd.date_range('20200102', periods=6)
df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD'))
df.get(['A', 'C'])
Antwoord 18
Om meerdere kolommen te selecteren, extraheert u ze en bekijkt u ze daarna: df
heette voorheen dataframe, maak vervolgens een nieuw dataframe df1
en selecteer de kolommen A t/m D die u wilt uitpakken en bekijken.
df1 = pd.DataFrame(data_frame, columns=['Column A', 'Column B', 'Column C', 'Column D'])
df1
Alle vereiste kolommen worden weergegeven!
Antwoord 19
Ik heb daar verschillende antwoorden op gezien, maar één bleef me onduidelijk. Hoe zou u die kolommen van interesse selecteren?
Het antwoord daarop is dat als je ze in een lijst hebt verzameld, je gewoon naar de kolommen kunt verwijzen met behulp van de lijst.
Voorbeeld
print(extracted_features.shape)
print(extracted_features)
(63,)
['f000004' 'f000005' 'f000006' 'f000014' 'f000039' 'f000040' 'f000043'
'f000047' 'f000048' 'f000049' 'f000050' 'f000051' 'f000052' 'f000053'
'f000054' 'f000055' 'f000056' 'f000057' 'f000058' 'f000059' 'f000060'
'f000061' 'f000062' 'f000063' 'f000064' 'f000065' 'f000066' 'f000067'
'f000068' 'f000069' 'f000070' 'f000071' 'f000072' 'f000073' 'f000074'
'f000075' 'f000076' 'f000077' 'f000078' 'f000079' 'f000080' 'f000081'
'f000082' 'f000083' 'f000084' 'f000085' 'f000086' 'f000087' 'f000088'
'f000089' 'f000090' 'f000091' 'f000092' 'f000093' 'f000094' 'f000095'
'f000096' 'f000097' 'f000098' 'f000099' 'f000100' 'f000101' 'f000103']
Ik heb de volgende lijst/NumPy-array extracted_features
, met 63 kolommen. De originele dataset heeft 103 kolommen, en ik zou precies die willen extraheren, dan zou ik
dataset[extracted_features]
En je krijgt dit
Dit zou je vaak gebruiken in machine learning(meer specifiek, bij het selecteren van functies ). Ik zou ook andere manieren willen bespreken, maar ik denk dat dat al is behandeld door andere Stack Overflower-gebruikers.
Antwoord 20
def get_slize(dataframe, start_row, end_row, start_col, end_col):
assert len(dataframe) > end_row and start_row >= 0
assert len(dataframe.columns) > end_col and start_col >= 0
list_of_indexes = list(dataframe.columns)[start_col:end_col]
ans = dataframe.iloc[start_row:end_row][list_of_indexes]
return ans
Gebruik gewoon deze functie
Antwoord 21
Om sommige kolommen uit te sluiten, kunt u ze in de kolomindex neerzetten. Bijvoorbeeld:
A B C D
0 1 10 100 1000
1 2 20 200 2000
Selecteer alle kolommen behalve één:
df[df.columns.drop('C')]
Uitvoer:
A B D
0 1 10 1000
1 2 20 2000
Selecteer alles behalve twee:
df[df.columns.drop(['B', 'D'])]
Uitvoer:
A C
0 1 100
1 2 200