J'ai un dataframe df
1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2.0 2.1 2.2 2.3 0 False False False True False False False False False False True False False False
comme celui-ci
1. 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2.0 2.1 2.2 2.3 0 0 2 42 50 46 6 0 0 1 41 49 45 5 0
et j'aimerais get
df = pd.DataFrame( columns=[1., 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0, 2.1, 2.2, 2.3], data=[[0, 2, 42, 50, 46, 6, 0, 0, 1, 41, 49, 45, 5, 0]] )
(note: j'utilise un dataframe car je gère en plus d'autres données pour chaque colonne.). Comment puis-je obtenir un dataframe comme celui-ci, par exemple en utilisant groupby
avec GroupBy.apply
?
3 Réponses :
Convertissez les valeurs en int et trouvez le maximum par groupe:
1.0 1.1 1.2 1.3 1.4 ... 1.9 2.0 2.1 2.2 2.3 0 False False False True False ... False True False False False
Sortie
groups = df.groupby(df.columns.astype(int), axis=1).idxmax() result = pd.DataFrame(data=[df.columns.isin(groups.values.flatten())], columns=df.columns.values) print(result)
Si vous voulez correspondre exactement à votre sortie que vous pourriez faire:
1.3 2.0 0 True True
Sortie
groups = df.groupby(df.columns.astype(int), axis=1).idxmax() result = pd.DataFrame(columns=groups.values.flatten(), data=groups.values.astype(bool)) print(result)
UPDATE
Compte tenu des nouvelles exigences que vous pourriez faire:
1 2 0 1.3 2.0
Sortie
XXX
C'est ce qu'on appelle local max, nous pouvons faire argrelextrema
df[:]=df.columns.isin(df.columns[idx[0]]) df Out[234]: 1.0 1.1 1.2 1.3 1.4 ... 1.9 2.0 2.1 2.2 2.3 0 False False False True False ... False True False False False [1 rows x 14 columns]
Pour faire correspondre la sortie
from scipy.signal import argrelextrema idx=argrelextrema(df.loc[0].values,np.greater) df.columns[idx[0]] Out[227]: Float64Index([1.3, 2.0], dtype='float64')
p>
Essayez :
1.0 1.1 1.2 1.3 ... 2.0 2.1 2.2 2.30 False False False True ... True False False False [1 rows x 14 columns] [Program finished]
Sortie :
x=df.sort_values(by=0, axis=1, ascending=False).columns df[x[:2]]=True df[x[2:]]=False print(df)