【发布时间】:2020-04-02 19:20:45
【问题描述】:
我有以下测试数据:
import pandas as pd
import datetime
data = {'date': ['2014-01-01', '2014-01-02', '2014-01-03', '2014-01-04', '2014-01-05', '2014-01-06', '2014-01-07'],
'id': [1, 2, 2, 3, 4, 4, 5], 'name': ['Darren', 'Sabrina', 'Steve', 'Sean', 'Ray', 'Stef', 'Dany']}
data = pd.DataFrame(data)
data['date'] = pd.to_datetime(data['date'])
问题是:回溯 x 天(从每个条目查看),是否有超过 y 个不同的名称共享相同的 id?
这是我编写的代码。在我的示例中,我返回 x=2 天并检查至少两个共享相同 ID 的不同名称 (y=1)。如果至少存在两个不同的名称,我在列表“result_store”中保存 1,否则为 0。当然,在这个例子中,如果 i 小于 x,则返回 x 天是不可能的,但是这个小不准确对于我。
def rule(data, x=2, y=1):
result_store = []
for i in range(data.shape[0]):
id = data['id'][i]
end_time = data['date'][i]
start_time = end_time-datetime.timedelta(days=x)
time_frame = data[(data['date'] >= start_time) & (data['date'] <= end_time)]
time_frame = time_frame.loc[time_frame['id'] == id]
distinct_names = time_frame['name'].nunique()
if distinct_names > y:
result_store.append(1)
else:
result_store.append(0)
return result_store
结果是
[0, 0, 1, 0, 0, 1, 0]
实际上,我有数千行,我的解决方案非常慢。我也尝试过使用 parmap 对索引进行并行化,但速度提升也不令人满意。有没有更有效的方法来做到这一点?也许通过使用 pyspark?
谢谢!
【问题讨论】:
标签: python pandas datetime pyspark timestamp