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

时间:2019-09-10 17:35:17

标签: python pandas

我有一个包含3列candlepointtime的数据框。如果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

2 个答案:

答案 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:当timepoint时,我们对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