我有一个包含3列candle
,point
和time
的数据框。如果candle
中的蜡烛到达终点,b
,则创建一个新列,其中包含蜡烛到达终点的时间
我尝试这样做
df = pd.DataFrame({'candle':[23,22,25,23,22,23,25,25,22],'point':['a','a','a','b','b','c','b','c','a'],'time':['2019-07-05 12:22:22','2019-07-10 12:22:22','2019-07-15 12:22:22','2019-07-20 12:22:22','2019-07-25 12:22:22','2019-07-30 12:22:22','2019-07-35 12:22:22','2019-07-40 12:22:22','2019-07-45 12:22:22']})
df
Out[5]:
candle point time
0 23 a 2019-07-05 12:22:22
1 22 a 2019-07-10 12:22:22
2 25 a 2019-07-15 12:22:22
3 23 b 2019-07-20 12:22:22
4 22 b 2019-07-25 12:22:22
5 23 c 2019-07-30 12:22:22
6 25 b 2019-07-35 12:22:22
7 25 c 2019-07-40 12:22:22
8 22 a 2019-07-45 12:22:22
def arrival_dates(df,end):
candle_at_target = df[df["point"] == end]
df = df.merge(cars_at_target,how='left',on="candle")
return df
end_point = 'b'
问题是,我不知道如何从这里继续
预期输出
candle point time passed_time
0 23 a 2019-07-05 12:22:22 2019-07-20 12:22:22
1 22 a 2019-07-10 12:22:22 2019-07-25 12:22:22
2 25 a 2019-07-15 12:22:22 2019-07-35 12:22:22
3 23 b 2019-07-20 12:22:22 2019-07-20 12:22:22
4 22 b 2019-07-25 12:22:22 2019-07-25 12:22:22
5 23 c 2019-07-30 12:22:22 2019-07-20 12:22:22
6 25 b 2019-07-35 12:22:22 2019-07-35 12:22:22
7 25 c 2019-07-40 12:22:22 2019-07-35 12:22:22
8 22 a 2019-07-45 12:22:22 2019-07-25 12:22:22
答案 0 :(得分:5)
做到这一点:
df = pd.DataFrame({'candle':[23,22,25,23,22,23,25,25,22],'point':['a','a','a','b','b','c','b','c','a'],'time':['2019-07-05 12:22:22','2019-07-10 12:22:22','2019-07-15 12:22:22','2019-07-20 12:22:22','2019-07-25 12:22:22','2019-07-30 12:22:22','2019-07-35 12:22:22','2019-07-40 12:22:22','2019-07-45 12:22:22']})
times = df[df.point=='b'].set_index('candle').time
df['passed_time'] = df.candle.map(times)
map
是非常有用的功能,当您要广播整个组的值时!
发生了什么事?
让我们分解times
变量:
df[df.point=='b']
占据point
列取值b
.set_index('candle')
:我们将列candle
设置为索引,以供以后与地图一起使用
.time
:当time
为point
时,我们对b
列感兴趣。
因此,现在我们有了一个times
系列,其中每个值是每个蜡烛获取值b
的时间,并且该系列的索引是蜡烛名称。
然后出现map
:在这种情况下,我们将函数应用于candle
列,并将其赋予times
系列(但最好将其视为{ {1}},其中键是索引,值是系列值)。
dict
所做的工作是调查此map
系列,并填充新的times
列,以寻找passed_time
列和{{1 }}索引,只要有匹配项,该列就会填充candle
个值。
这就是为什么times
步骤很关键的原因:否则,您的times
系列将具有原始索引,并且set_index('candle')
列和times
系列之间将没有匹配项
输出:
candle
答案 1 :(得分:1)
替代解决方案:
df=df.sort_values('candle').reset_index(drop=True)
df['passed_time']=df.loc[df['point'].eq('b'),'time'].repeat(df.groupby('candle').size()).reset_index(drop=True)
candle point time passed_time
0 22 a 2019-07-10 12:22:22 2019-07-25 12:22:22
1 22 b 2019-07-25 12:22:22 2019-07-25 12:22:22
2 22 a 2019-07-45 12:22:22 2019-07-25 12:22:22
3 23 a 2019-07-05 12:22:22 2019-07-20 12:22:22
4 23 b 2019-07-20 12:22:22 2019-07-20 12:22:22
5 23 c 2019-07-30 12:22:22 2019-07-20 12:22:22
6 25 a 2019-07-15 12:22:22 2019-07-35 12:22:22
7 25 b 2019-07-35 12:22:22 2019-07-35 12:22:22
8 25 c 2019-07-40 12:22:22 2019-07-35 12:22:22