Mam dataframe, którego wartości kolumn są skórkami. Nieobecne odtworzenie Dataframe, czy istnieje sposób radzenia sobie z dataframe, ponieważ jest to w celu filtrowania Dataframe zgodnie z poniższym przykładem:

Aby skonstruować dataframe (usprawiedliwić zawiłą konstrukcję):

import pandas as pd

columns = ['Fruit','Color','Firmness','Volume']
data = [['Apple','Green','Soft',5],
        ['Apple','Red','Firm',5],
        ['Blueberry','Blue','Soft',5],
        ['Blueberry','Blue','Soft',5],
        ['Pear','Green','Soft',5],
        ['Pear','Green','Firm',5]]

df = pd.DataFrame(data=data,columns=columns,index=[0,1,2,3,4,5])

def all_values(values):
    
    return tuple([value for value in values])

agg_dict = {'Color':all_values,'Firmness':all_values,'Volume':'sum'}

df = df.groupby(by='Fruit').agg(agg_dict)

df

            Color           Firmness        Volume
Fruit           
Apple       (Green, Red)    (Soft, Firm)    10
Blueberry   (Blue, Blue)    (Soft, Soft)    10
Pear        (Green, Green)  (Soft, Firm)    10

Teraz, co próbuję osiągnąć, jest zwrócenie dataframe pokazującym tylko wiersze, w których druga wartość w krotkowości jest "firma". To byłby rząd jabłkowy i wiersz gruszkowy w tym przypadku.

Czy jest coś podobnego do metody .str.containsa, którego mogę użyć w tej instancji? Aby odpowiednio filtrować Dataframe? Lub jakakolwiek inna odpowiednia metoda, która może bezpośrednio wykonać filtrowanie?

Dzięki!

Aktualizacja:

Oto jedna próba, która przynajmniej pokazuje pożądany wynik, ale nie osiągnie celu, ponieważ musiałem określić "miękką" jako pierwszą część krotki i nie powinno być konieczne. Czuje się również dość hack:

df = df.where(df['Firmness'] == ('Soft', 'Firm')).dropna()

df

        Color           Firmness        Volume
Fruit           
Apple   (Green, Red)    (Soft, Firm)    10.0
Pear    (Green, Green)  (Soft, Firm)    10.0
0
agftrading 20 marzec 2021, 04:21

2 odpowiedzi

Najlepsza odpowiedź

Spróbuj z agg, jeśli ... else

out = df.groupby('Fruit').agg(lambda x : x.sum() if x.dtype==int else tuple(x))
Out[332]: 
                    Color      Firmness  Volume
Fruit                                          
Apple        (Green, Red)  (Soft, Firm)      10
Blueberry    (Blue, Blue)  (Soft, Soft)      10
Pear       (Green, Green)  (Soft, Firm)      10

Następnie na twoje pytanie

out = out[out.Firmness.str[1]=='Firm']
out
Out[335]: 
                Color      Firmness  Volume
Fruit                                      
Apple    (Green, Red)  (Soft, Firm)      10
Pear   (Green, Green)  (Soft, Firm)      10
1
BENY 20 marzec 2021, 01:32

Na twoje pytanie, używając aplikacji i lambda

df[df.apply(lambda x:x.Firmness[1]=='Firm' , axis=1)]

1
jkhoo 20 marzec 2021, 01:49