pandas
Booleska indexering av dataframe
Sök…
Introduktion
Få åtkomst till rader i ett dataframe med hjälp av DataFrame-indexeringsobjekten .ix
, .loc
, .iloc
och hur det skiljer sig från att använda en boolesk mask.
Åtkomst till en DataFrame med ett booleskt index
Detta kommer att vara vårt exempel på dataram:
df = pd.DataFrame({"color": ['red', 'blue', 'red', 'blue']},
index=[True, False, True, False])
color
True red
False blue
True red
False blue
Åtkomst med .loc
df.loc[True]
color
True red
True red
Åtkomst med .iloc
df.iloc[True]
>> TypeError
df.iloc[1]
color blue
dtype: object
Viktigt att notera är att äldre panda-versioner inte skilde mellan booleska och
.iloc[True]
, och därför skulle.iloc[True]
returnera samma som.iloc[1]
Åtkomst med .ix
df.ix[True]
color
True red
True red
df.ix[1]
color blue
dtype: object
Som du ser har .ix
två beteenden. Detta är mycket dålig praxis i kod och därför bör det undvikas. .iloc
eller .loc
att vara mer tydlig.
Applicera en boolesk mask på en dataframe
Detta kommer att vara vårt exempel på dataram:
color name size
0 red rose big
1 blue violet big
2 red tulip small
3 blue harebell small
Använda den magiska __getitem__
eller []
accessor. Om du ger det en lista över sant och falskt i samma längd som dataframe ger dig:
df[[True, False, True, False]]
color name size
0 red rose big
2 red tulip small
Maskera data baserat på kolumnvärde
Detta kommer att vara vårt exempel på dataram:
color name size
0 red rose big
1 blue violet small
2 red tulip small
3 blue harebell small
Genom att få åtkomst till en enda kolumn från en dataram kan vi använda en enkel jämförelse ==
att jämföra varje element i kolumnen med den givna variabeln, vilket ger en pd.Series
of True and False
df['size'] == 'small'
0 False
1 True
2 True
3 True
Name: size, dtype: bool
Denna pd.Series
är en förlängning av en np.array
som är en förlängning av en enkel list
Således kan vi överlämna detta till __getitem__
eller []
accessor som i exemplet ovan.
size_small_mask = df['size'] == 'small'
df[size_small_mask]
color name size
1 blue violet small
2 red tulip small
3 blue harebell small
Maskera data baserat på indexvärdet
Detta kommer att vara vårt exempel på dataram:
color size
name
rose red big
violet blue small
tulip red small
harebell blue small
Vi kan skapa en mask baserad på indexvärdena, precis som på ett kolumnvärde.
rose_mask = df.index == 'rose'
df[rose_mask]
color size
name
rose red big
Men att göra detta är nästan samma som
df.loc['rose']
color red
size big
Name: rose, dtype: object
Den viktiga skillnaden är att när .loc
bara möter en rad i indexet som matchar kommer det att returnera en pd.Series
, om den möter fler rader som matchar, kommer den att returnera en pd.DataFrame
. Detta gör denna metod ganska instabil.
Detta beteende kan kontrolleras genom att ge .loc
en lista över en enda post. Detta kommer att tvinga den att returnera en dataram.
df.loc[['rose']]
color size
name
rose red big