Familiar with slicing in Python/pandas but how does this operate when a column-based index is set?
Have a dataframe, d
, that I’ve created a column-axis for as follows:
levels_df = pd.DataFrame(levels)
levels_df = levels_df.set_axis(new_labels,axis=1).iloc[2:]
levels_df.head(10)
Out[14]:
Position 9.0 8.0 7.0 6.0 ... 7.0 8.0 9.0
Side 1.0 1.0 1.0 1.0 ... 0.0 0.0 0.0 0.0
2 4484.75 4485.0 4485.25 4485.5 ... 4488.75 4489.0 4489.25 4489.5
3 4484.75 4485.0 4485.25 4485.5 ... 4488.75 4489.0 4489.25 4489.5
4 4484.75 4485.0 4485.25 4485.5 ... 4488.75 4489.0 4489.25 4489.5
5 4484.75 4485.0 4485.25 4485.5 ... 4488.75 4489.0 4489.25 4489.5
6 4484.75 4485.0 4485.25 4485.5 ... 4488.75 4489.0 4489.25 4489.5
7 4484.75 4485.0 4485.25 4485.5 ... 4488.75 4489.0 4489.25 4489.5
8 4484.75 4485.0 4485.25 4485.5 ... 4488.75 4489.0 4489.25 4489.5
9 4484.75 4485.0 4485.25 4485.5 ... 4488.75 4489.0 4489.25 4489.5
10 4484.75 4485.0 4485.25 4485.5 ... 4488.75 4489.0 4489.25 4489.5
11 4484.75 4485.0 4485.25 4485.5 ... 4488.75 4489.0 4489.25 4489.5
[10 rows x 20 columns]
levels_df
Position 9.0 8.0 7.0 6.0 5.0 4.0 3.0 2.0 1.0 0.0 0.0 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0
Side 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
2 4484.75 4485.0 4485.25 4485.5 4485.75 4486.0 4486.25 4486.5 4486.75 4487.0 4487.25 4487.5 4487.75 4488.0 4488.25 4488.5 4488.75 4489.0 4489.25 4489.5
3 4484.75 4485.0 4485.25 4485.5 4485.75 4486.0 4486.25 4486.5 4486.75 4487.0 4487.25 4487.5 4487.75 4488.0 4488.25 4488.5 4488.75 4489.0 4489.25 4489.5
4 4484.75 4485.0 4485.25 4485.5 4485.75 4486.0 4486.25 4486.5 4486.75 4487.0 4487.25 4487.5 4487.75 4488.0 4488.25 4488.5 4488.75 4489.0 4489.25 4489.5
5 4484.75 4485.0 4485.25 4485.5 4485.75 4486.0 4486.25 4486.5 4486.75 4487.0 4487.25 4487.5 4487.75 4488.0 4488.25 4488.5 4488.75 4489.0 4489.25 4489.5
6 4484.75 4485.0 4485.25 4485.5 4485.75 4486.0 4486.25 4486.5 4486.75 4487.0 4487.25 4487.5 4487.75 4488.0 4488.25 4488.5 4488.75 4489.0 4489.25 4489.5
7 4484.75 4485.0 4485.25 4485.5 4485.75 4486.0 4486.25 4486.5 4486.75 4487.0 4487.25 4487.5 4487.75 4488.0 4488.25 4488.5 4488.75 4489.0 4489.25 4489.5
8 4484.75 4485.0 4485.25 4485.5 4485.75 4486.0 4486.25 4486.5 4486.75 4487.0 4487.25 4487.5 4487.75 4488.0 4488.25 4488.5 4488.75 4489.0 4489.25 4489.5
How do I slice such a dataframe to retrieve a filtered version of the df?
For instance, something like this:
levels_df.iloc[:5,(levels_df.Position==8) & (levels_df.Side==1)]
Would return:
Position 8.0
Side 1.0
2 4485.0
3 4485.0
4 4485.0
5 4485.0
6 4485.0
Instead of the error:
levels_df[(levels_df.Position==8) & (levels_df.Side==1)]
Traceback (most recent call last):
File "/tmp/ipykernel_424060/105426524.py", line 1, in <module>
levels_df[(levels_df.Position==8) & (levels_df.Side==1)]
File "/home/chris/anaconda3/lib/python3.9/site-packages/pandas/core/generic.py", line 5575, in __getattr__
return object.__getattribute__(self, name)
AttributeError: 'DataFrame' object has no attribute 'Position'
1
I do not know why you have done it the way you did. I personaly would consider pandas multi-indexing
But this should work.
levels_df = levels_df.T
filtered_df = levels_df[(levels_df['Position'] == 8) & (levels_df['Side'] == 1)]
desired_form = filtered_df.T
1