Extraiga filas categóricas y aplíquelas a todas las filas posteriores hasta que se encuentre una nueva categoría

2

Aquí hay un DataFrame ficticio de mis datos, tengo filas categóricas (representadas por la existencia del NaNvalor de 'Price') y filas de datos (representadas por un no NaN valor de 'Price').

gear = [('Baseball', None), ('Bat', 1), ('Glove', 2), ('Soccer', None), ('Shoes', 3), ('Ball', 4), ('Football', None), ('Helmet', 6)]
dummy_df = pd.DataFrame(gear, columns=['Name', 'Price'])

       Name  Price
0  Baseball    NaN
1       Bat    1.0
2     Glove    2.0
3    Soccer    NaN
4     Shoes    3.0
5      Ball    4.0
6  Football    NaN
7    Helmet    6.0

Me gustaría crear una nueva columna 'Sport'que se aplicará a cada fila en la categoría, por supuesto, hasta que llegue al próximo deporte. El DataFrame resultante se vería así con las filas categóricas eliminadas:

       Name  Price     Sport
1       Bat    1.0  Baseball
2     Glove    2.0  Baseball
3     Shoes    3.0    Soccer
4      Ball    4.0    Soccer
5    Helmet    6.0  Football

Estaba pensando en crear una nueva columna 'Sport'que es el valor de Namesi Priceno es de NaNotra manera NaN. ¿Luego usa a ffillo algo y luego suelta las NaNfilas de precios?

2

Pruebe maskel notna, luego ffillpara obtener el correcto Sport:

s = dummy_df['Price'].notna()
dummy_df.assign(Sport=dummy_df['Name'].mask(s).ffill()).loc[s]

Producción:

     Name  Price     Sport
1     Bat    1.0  Baseball
2   Glove    2.0  Baseball
4   Shoes    3.0    Soccer
5    Ball    4.0    Soccer
7  Helmet    6.0  Football
0
dummy_df["Sport"] = dummy_df.groupby(dummy_df.Price.isna().cumsum()).Name.transform("first")
dummy_df[dummy_df.Price.notna()]
#      Name  Price     Sport
# 1     Bat    1.0  Baseball
# 2   Glove    2.0  Baseball
# 4   Shoes    3.0    Soccer
# 5    Ball    4.0    Soccer
# 7  Helmet    6.0  Football