使用3列中的值,创建一个新列,该列采用3列之一中的值

the*_*kyi 0 python pandas

我有一个包含3列的数据框candlepoint并且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)

Jua*_*n C 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)
Run Code Online (Sandbox Code Playgroud)

map 当您要广播整个组的值时,此功能非常有用!

发生了什么?

让我们分解times变量:

df[df.point=='b']point列值所在的所有行b

.set_index('candle'):我们将列设置candle为索引,以供以后与map一起使用

.time:我们感兴趣的time时候列pointb

因此,现在我们有了一个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)