我有一个包含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'
Run Code Online (Sandbox Code Playgroud)
问题是,我不知道如何从这里继续
预期产量
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
Run Code Online (Sandbox Code Playgroud)
这样做:
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)
Run Code Online (Sandbox Code Playgroud)
map 当您要广播整个组的值时,此功能非常有用!
发生了什么?
让我们分解times变量:
df[df.point=='b']取point列值所在的所有行b
.set_index('candle'):我们将列设置candle为索引,以供以后与map一起使用
.time:我们感兴趣的time时候列point的b。
因此,现在我们有了一个times系列,其中每个值是每个蜡烛获取值的时间,b并且该系列的索引是蜡烛名称。
然后是map:在这种情况下,我们将函数应用于candle列并为其指定了timesSeries(但最好将其视为dict键是索引而值是Series值的地方)。
是什么map做的是,它看起来这个times系列,它填补了新passed_time列寻找使之间的匹配candle列和times指标,只要有一个匹配的列被填充times值。
这就是为什么该set_index('candle')步骤很关键的原因:否则您的times系列将具有原始索引,并且candle列和times系列之间将没有匹配项。
输出:
A B C 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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
40 次 |
| 最近记录: |