我有这样的数据帧:
id | date | status
________________________
... ... ...
1 |2020-01-01 | reserve
1 |2020-01-02 | sold
2 |2020-01-01 | free
3 |2020-01-03 | reserve
3 |2020-01-25 | signed
3 |2020-01-30 | sold
... ... ...
10 |2020-01-02 | signed
10 |2020-02-15 | sold
... ... ....
我希望找到状态为sold
的所有行的索引,然后在其他情况下,为这些行的前29天(状态为sold
的行)分配1
和0
.
所需的数据帧如下
id | date | status | label
_________________________________
... ... ... ...
1 |2020-01-01 | reserve | 1
1 |2020-01-02 | sold | 1
2 |2019-12-02 | free | 0 # no sold status for 2
3 |2020-01-03 | reserve | 1
3 |2020-01-25 | signed | 1
3 |2020-01-30 | sold | 1
... ... ... ...
10 |2020-01-02 | signed | 0
10 |2020-02-15 | sold | 1 # more than 29 days from 2020-02-15
... ... .... ...
我try 使用apply()
,但我发现不能像那样调用函数
def make_labels(df):
def get_indices(df):
return list(df[df['date'] >= df.iloc[-1]['date'] - timedelta(days=29)].index)
df.sort_values(['id', 'date'], inplace=True)
zero_labels = pd.Series(0, index = df.index, name='sold_labels')
one_lables = df.groupby('id')['status'].apply(lambda s: get_indices if s.iloc[-1] == 'sold').sum()
zero_labels.loc[one_lables] = 1
return zero_labels
df['label'] = make_labels(df)
输入的数据帧构造函数:
d = {'id': [1, 1, 2, 3, 3, 3, 10, 10],
'date': ['2020-01-01', '2020-01-02', '2020-01-01', '2020-01-03', '2020-01-25', '2020-01-30', '2020-01-02', '2020-02-15'],
'status': ['reserve', 'sold', 'free', 'reserve', 'signed', 'sold', 'signed', 'sold']
}
df = pd.DataFrame(data=d)