Как получить локальный максимум в диапазонах строк в одномерном кадре данных? - PullRequest
1 голос
/ 30 октября 2019

У меня есть фрейм данных df

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]]
)

вот так

    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

, и я хотел бы получить

    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

(примечание:Я использую фрейм данных, потому что я дополнительно управляю другими данными для каждого столбца.)Как я могу получить такой кадр данных, например, используя groupby с GroupBy.apply?

Ответы [ 3 ]

3 голосов
/ 30 октября 2019

Это так называемый локальный максимум, мы можем сделать argrelextrema

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')

Для соответствия с выводом

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]
0 голосов
/ 30 октября 2019

Попробуйте:

x=df.sort_values(by=0, axis=1, ascending=False).columns

df[x[:2]]=True
df[x[2:]]=False
print(df)

Вывод:

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]
0 голосов
/ 30 октября 2019

Приведите значения к int и найдите максимум по группе:

result = df.groupby(df.columns.astype(int), axis=1).idxmax()
print(result)

Выход

     1    2
0  1.3  2.0

Если вы хотите точно соответствовать вашему выводу, вы можетеdo:

groups = df.groupby(df.columns.astype(int), axis=1).idxmax()

result = pd.DataFrame(columns=groups.values.flatten(), data=groups.values.astype(bool))

print(result)

Вывод

    1.3   2.0
0  True  True

ОБНОВЛЕНИЕ

Учитывая новые требования, которые вы можете выполнить:

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)

Выход

     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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...