Axis in Series
Series is a one-dimensional array of values. Under the hood, it uses NumPy ndarray. That is where the term “axis” came from. NumPy uses it quite frequently because ndarray can have a lot of dimensions.
Series object has only “axis 0” because it has only one dimension.

The arrow on the image displays “axis 0” and its direction for the Series object.
Usually, in Python, one-dimensional structures are displayed as a row of values. On the contrary, here we see that Series is displayed as a column of values.
Each cell in Series is accessible via index value along the “axis 0”. For our Series object indexes are: 0, 1, 2, 3, 4. Here is an example of accessing different values:
>>> import pandas as pd
>>> srs = pd.Series(['red', 'green', 'blue', 'white', 'black'])
>>> srs[0]
'red'
>>> srs[3]
'white'
Axis in DataFrame
DataFrame is a two-dimensional data structure akin to SQL table or Excel spreadsheet. It has columns and rows. Its columns are made of separate Series objects. Let’s see an example:

A DataFrame object has two axes: “axis 0” and “axis 1”. “axis 0” represents rows and “axis 1” represents columns. Now it’s clear that Series and DataFrame share the same direction for “axis 0” – it goes along rows direction.
Our DataFrame object has 0, 1, 2, 3, 4 indexes along the “axis 0”, and additionally, it has “axis 1” indexes which are: ‘a’ and ‘b’.
To access an element within DataFrame we need to provide two indexes (one per each axis). Also, instead of bare brackets, we need to use .loc method:
>>> import pandas as pd
>>> srs_a = pd.Series([1,3,6,8,9])
>>> srs_b = pd.Series(['red', 'green', 'blue', 'white', 'black'])
>>> df = pd.DataFrame({'a': srs_a, 'b': srs_b})
>>> df.loc[2, 'b']
'blue'
>>> df.loc[3, 'a']
8
more info : https://railsware.com/blog/python-for-machine-learning-pandas-axis-explained/