1
votes

Comment obtenir le maximum local dans les plages de lignes dans une trame de données 1D?

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 ?


0 commentaires

3 Réponses :


0
votes

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


0 commentaires

3
votes

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>


0 commentaires

0
votes

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)


0 commentaires