Python 大熊猫松脂
我试图做到以下几点:开始应该是零,直到R列低于20,然后是正,直到R列高于80,循环应该重复(重置)。在第19行之前,行为如预期的那样,但是在第20行,Start被莫名其妙地设置为1,尽管不符合标准。添加额外的列是可以的Python 大熊猫松脂,python,pandas,Python,Pandas,我试图做到以下几点:开始应该是零,直到R列低于20,然后是正,直到R列高于80,循环应该重复(重置)。在第19行之前,行为如预期的那样,但是在第20行,Start被莫名其妙地设置为1,尽管不符合标准。添加额外的列是可以的 df = pd.DataFrame(np.random.randint(0, 100, size=100), columns=['R']) df['Start'] = np.where((df.R < 20), 1, 0) df['End'] = np.where((df
df = pd.DataFrame(np.random.randint(0, 100, size=100), columns=['R'])
df['Start'] = np.where((df.R < 20), 1, 0)
df['End'] = np.where((df.R > 80), 1, 0)
df.loc[df['End'].shift().eq(0), 'Start'] = df['Start'].replace(0, np.nan).ffill().fillna(0).astype(int)
解决方案根据广亨的回答:
df = pd.DataFrame(np.random.randint(0, 100, size=100), columns=['R'])
df['Start'] = np.select([df['R'] < 20, df['R'] > 80], (1,0), np.nan)
df['Start'] = df['Start'].ffill()
df['Start'] = df.Start.combine(pd.Series(np.insert(abs(np.diff(df.Start)), 0, 0)), max, fill_value=0)
df=pd.DataFrame(np.random.randint(01000,size=100),columns=['R']))
df['Start']=np.select([df['R']<20,df['R']>80],(1,0),np.nan)
df['Start']=df['Start'].ffill()
df['Start']=df.Start.combine(pd.Series(np.insert)(abs(np.diff(df.Start)),0,0)),最大,填充值=0)
IIUC,您可以使用np。选择:
df['Start'] = np.select([df['R']>80, df['R']<20], (1,0), np.nan)
df['Start'] = df['Start'].ffill()
IIUC,您可以使用np。选择:
df['Start'] = np.select([df['R']>80, df['R']<20], (1,0), np.nan)
df['Start'] = df['Start'].ffill()
所以您只关心start
列?start是要激活的信号,我正在尝试切片,直到满足结束条件。然后观察另一个起动条件并重复。实际上,我试图避免循环。所以您只关心start
列?start是要激活的信号,我尝试切片,直到满足结束条件。然后观察另一个起动条件并重复。实际上,我正在努力避免循环。np.select([df['R']<20,df['R']>80],(1,0),np.nan)与我想要的非常接近,我只希望最后一个起始值(当R>80)也是正匹配。如果它是最后一个,您可以在ffill()
之前找到并屏蔽它。无法成功使用掩码,但是一个稍微麻烦的添加工作df['Start']=df.Start.combine(pd.Series(np.insert(abs(np.diff(df.Start)),0,0)),max,fill_值=0)。然而,我会假设这有严重的性能缺陷。df.iloc[::-1]['R'].gt(80).idxmax()
会给您提供R>80
的类出现。应该更清楚。我指的是每件事的最后一件。所以当R>80
时,开始列仍然有1。发布的问题中的解决方案具有预期的结果。非常感谢。np.select([df['R']<20,df['R']>80],(1,0),np.nan)非常接近我想要的,我只希望最后一个起始值(当R>80时)也是正匹配。如果它是最后一个,你可以在ffill()
之前找到并屏蔽它。无法成功使用掩码,但添加一个稍微麻烦的值对df有效['Start']=df.Start.combine(pd.Series(np.insert(abs(np.diff(df.Start)),0,0)),max,fill_value=0)。但是,我假设这有严重的性能缺陷。df.iloc[::-1]['R'].gt(80).idxmax()
会给你出现R>80
。应该更清楚。我指的是每次出现的最后一次。所以当R>80
时,开始栏仍然有1。发布的问题中的解决方案得到了预期的结果。非常感谢。
R Start End
11 82 1.0 1
12 63 1.0 0
13 37 1.0 0
14 21 1.0 0
15 88 1.0 1
16 9 0.0 0
17 13 0.0 0
18 83 1.0 1
19 47 1.0 0
20 68 1.0 0
21 42 1.0 0
22 67 1.0 0
23 26 1.0 0
24 79 1.0 0
25 87 1.0 1
26 96 1.0 1
27 39 1.0 0
28 50 1.0 0
29 94 1.0 1
30 95 1.0 1