Python 如何在1D数据帧中获得行范围内的局部最大值?

Python 如何在1D数据帧中获得行范围内的局部最大值?,python,pandas,dataframe,pandas-groupby,Python,Pandas,Dataframe,Pandas Groupby,我有一个数据帧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

我有一个数据帧
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

(注意:我使用的是dataframe,因为我还管理每个列的其他数据。)。如何获得这样的数据帧,例如使用with?

将值转换为int并按组查找最大值:

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

     1    2
0  1.3  2.0
    1.3   2.0
0  True  True
     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
如果要精确匹配输出,可以执行以下操作:

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

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

print(result)
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    2
0  1.3  2.0
    1.3   2.0
0  True  True
     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
更新

考虑到新的要求,您可以:

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

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

print(result)
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    2
0  1.3  2.0
    1.3   2.0
0  True  True
     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

将值强制转换为int并按组查找最大值:

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

     1    2
0  1.3  2.0
    1.3   2.0
0  True  True
     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
如果要精确匹配输出,可以执行以下操作:

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

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

print(result)
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    2
0  1.3  2.0
    1.3   2.0
0  True  True
     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
更新

考虑到新的要求,您可以:

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

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

print(result)
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    2
0  1.3  2.0
    1.3   2.0
0  True  True
     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

这就是所谓的本地最大值,我们可以执行
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]

这就是所谓的本地最大值,我们可以执行
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]
尝试:

x=df.sort_值(按=0,轴=1,升序=False)。列
df[x[:2]]=True
df[x[2:][]=False
打印(df)
输出:

1.01.11.21.3。。。2.0    2.1    2.2    2.30  
假假假真。。。真假假假
[1行x 14列]
[程序完成]
试试:

x=df.sort_值(按=0,轴=1,升序=False)。列
df[x[:2]]=True
df[x[2:][]=False
打印(df)
输出:

1.01.11.21.3。。。2.0    2.1    2.2    2.30  
假假假真。。。真假假假
[1行x 14列]
[程序完成]