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列]
[程序完成]