pandas
Dwarsdoorsneden van verschillende assen met MultiIndex
Zoeken…
Selectie van doorsneden met .xs
In [1]:
import pandas as pd
import numpy as np
arrays = [['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'],
['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']]
idx_row = pd.MultiIndex.from_arrays(arrays, names=['Row_First', 'Row_Second'])
idx_col = pd.MultiIndex.from_product([['A','B'], ['i', 'ii']], names=['Col_First','Col_Second'])
df = pd.DataFrame(np.random.randn(8,4), index=idx_row, columns=idx_col)
Out[1]:
Col_First A B
Col_Second i ii i ii
Row_First Row_Second
bar one -0.452982 -1.872641 0.248450 -0.319433
two -0.460388 -0.136089 -0.408048 0.998774
baz one 0.358206 -0.319344 -2.052081 -0.424957
two -0.823811 -0.302336 1.158968 0.272881
foo one -0.098048 -0.799666 0.969043 -0.595635
two -0.358485 0.412011 -0.667167 1.010457
qux one 1.176911 1.578676 0.350719 0.093351
two 0.241956 1.082138 -0.516898 -0.196605
.xs
accepteert een level
(de naam van genoemd niveau of een geheel getal) en een axis
: 0 voor rijen, 1 voor kolommen.
.xs
is beschikbaar voor zowel pandas.Series
als pandas.DataFrame
.
Selectie op rijen:
In [2]: df.xs('two', level='Row_Second', axis=0)
Out[2]:
Col_First A B
Col_Second i ii i ii
Row_First
bar -0.460388 -0.136089 -0.408048 0.998774
baz -0.823811 -0.302336 1.158968 0.272881
foo -0.358485 0.412011 -0.667167 1.010457
qux 0.241956 1.082138 -0.516898 -0.196605
Selectie op kolommen:
In [3]: df.xs('ii', level=1, axis=1)
Out[3]:
Col_First A B
Row_First Row_Second
bar one -1.872641 -0.319433
two -0.136089 0.998774
baz one -0.319344 -0.424957
two -0.302336 0.272881
foo one -0.799666 -0.595635
two 0.412011 1.010457
qux one 1.578676 0.093351
two 1.082138 -0.196605
.xs
werkt alleen voor selectie, toewijzing is NIET mogelijk ( .xs
, niet instellen): ¨
In [4]: df.xs('ii', level='Col_Second', axis=1) = 0
File "<ipython-input-10-92e0785187ba>", line 1
df.xs('ii', level='Col_Second', axis=1) = 0
^
SyntaxError: can't assign to function call
.Loc en slicers gebruiken
In tegenstelling tot de .xs
methode kunt u waarden toewijzen. Indexeren met behulp van slicers is beschikbaar sinds versie 0.14.0
.
In [1]:
import pandas as pd
import numpy as np
arrays = [['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'],
['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']]
idx_row = pd.MultiIndex.from_arrays(arrays, names=['Row_First', 'Row_Second'])
idx_col = pd.MultiIndex.from_product([['A','B'], ['i', 'ii']], names=['Col_First','Col_Second'])
df = pd.DataFrame(np.random.randn(8,4), index=idx_row, columns=idx_col)
Out[1]:
Col_First A B
Col_Second i ii i ii
Row_First Row_Second
bar one -0.452982 -1.872641 0.248450 -0.319433
two -0.460388 -0.136089 -0.408048 0.998774
baz one 0.358206 -0.319344 -2.052081 -0.424957
two -0.823811 -0.302336 1.158968 0.272881
foo one -0.098048 -0.799666 0.969043 -0.595635
two -0.358485 0.412011 -0.667167 1.010457
qux one 1.176911 1.578676 0.350719 0.093351
two 0.241956 1.082138 -0.516898 -0.196605
Selectie op rijen :
In [2]: df.loc[(slice(None),'two'),:]
Out[2]:
Col_First A B
Col_Second i ii i ii
Row_First Row_Second
bar two -0.460388 -0.136089 -0.408048 0.998774
baz two -0.823811 -0.302336 1.158968 0.272881
foo two -0.358485 0.412011 -0.667167 1.010457
qux two 0.241956 1.082138 -0.516898 -0.196605
Selectie op kolommen:
In [3]: df.loc[:,(slice(None),'ii')]
Out[3]:
Col_First A B
Col_Second ii ii
Row_First Row_Second
bar one -1.872641 -0.319433
two -0.136089 0.998774
baz one -0.319344 -0.424957
two -0.302336 0.272881
foo one -0.799666 -0.595635
two 0.412011 1.010457
qux one 1.578676 0.093351
two 1.082138 -0.196605
Selectie op beide assen ::
In [4]: df.loc[(slice(None),'two'),(slice(None),'ii')]
Out[4]:
Col_First A B
Col_Second ii ii
Row_First Row_Second
bar two -0.136089 0.998774
baz two -0.302336 0.272881
foo two 0.412011 1.010457
qux two 1.082138 -0.196605
Opdracht werkt (in tegenstelling tot .xs
):
In [5]: df.loc[(slice(None),'two'),(slice(None),'ii')]=0
df
Out[5]:
Col_First A B
Col_Second i ii i ii
Row_First Row_Second
bar one -0.452982 -1.872641 0.248450 -0.319433
two -0.460388 0.000000 -0.408048 0.000000
baz one 0.358206 -0.319344 -2.052081 -0.424957
two -0.823811 0.000000 1.158968 0.000000
foo one -0.098048 -0.799666 0.969043 -0.595635
two -0.358485 0.000000 -0.667167 0.000000
qux one 1.176911 1.578676 0.350719 0.093351
two 0.241956 0.000000 -0.516898 0.000000
Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow