我正在尝试创建一个列,该列在每个入口和出口之间选择所有日期。每个条目只与一个出口配对。
日期是从最近的日期到第一次约会的顺序。
import pandas as pd
import numpy
df = pd.DataFrame({'Entry':[0,0,0,1,0 ,0,0,0,1,0,0,1],
'Exit':[1,0,0,0,0,1,0,1,0,0,1,0]},
index = pd.date_range('1/1/2019',periods = 12))
df1 = df.iloc[::-1]
df1基表如下所示:

我想要创建一个名为windows的额外列,其外观与以下所示完全相同:

发布于 2019-02-13 04:32:39
这将起作用(我知道这可能不是最重要的节奏曲,但希望你们都能给我分数以提高可读性):
# First I sort so I don't have to work backwards
df1.sort_index(inplace=True)
# Generate Window and then iteratively fill it
df1['Window'] = 0
for index, row in df1.iterrows():
if row.Entry == 1:
# Once found, fill all intermediate values as 1 and break.
# Nothing happens if no exit found.
for subindex, subrow in df1.loc[index:].iterrows():
if subrow.Exit == 1:
df1.loc[index:subindex,'Window'] = 1
break
# Sort back to the index order you wanted
df1.sort_index(inplace=True,ascending=False)发布于 2019-02-13 05:38:33
你在窗口函数中的逻辑对我来说不是很清楚。但是,您需要的似乎是应用一个按行排列的函数,它可以存储一些内存(最后一次输入状态或其他什么)。一个好的方法是定义一个可调用的类,如下所示。注意,在使用此方法之前,您需要按递增日期顺序对df进行排序。
class WindowFunc(object):
def __init__(self, initial_status):
self.status = initial_status
def __call__(self, row, enter_col, exit_col):
enter_val = row[enter_col]
exit_val = row[exit_col]
if self.status == 0 and enter_val == 1 and exit_val != 1:
self.status = 1
return 1
elif self.status == 1 and enter_val != 1 and exit_val == 1:
current_status = self.status
self.status = 0
return current_status
else:
return self.status
window_fn = WindowFunc(0)
df['window'] = np.apply_along_axis(window_fn, 1, df, 0, 1)实例存储状态,并跨行保存它的内存。您可以更新类中的逻辑以满足您的需求。
https://stackoverflow.com/questions/54661538
复制相似问题