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


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow