通过比较两个熊猫数据框创建一列

时间:2019-08-13 22:59:02

标签: pandas loops dataframe if-statement

您好,我正在尝试通过从数据帧列中复制值来在数据帧中创建新列,以便如果另一列的值满足条件a,则基于另一个数据帧中其他两列的列。 / p>

为了更直观地介绍这两个数据框,

df1:
Time_Ratio time_elapsed  delta_retention

Time_Ratio time_elapsed  delta_retention

0.22        0.05          0.000642
0.23        0.07          0.000693
0.24        1.75          0.000740
0.25        3.75          0.000784
0.26        4.50          0.000825
0.27       7.25           0.000725
0.74       277.50         0.000593
0.75       281.25         0.000557
0.76       285.00         0.000523
0.77       288.75         0.000489

df2:
Start         End         Confidence
0.000000    1.416666      0.319943
0.000000    1.416666      0.424269
0.000000    1.416666      0.605917
0.000000    1.416666      0.602294
0.000000    1.416666      0.562171
0.000000    1.416666      0.790947
0.000000    1.416666      0.545534
1.433333    3.616666      0.618783
1.433333    3.616666      0.803730
1.433333    3.616666      0.385044
3.633333    7.700000      0.490057
3.633333    7.700000      0.685507
239.850000  340.716666    0.937618
239.850000  340.716666    0.829939
239.850000  340.716666    0.852264
239.850000  340.716666    0.820325

我想做的是找到在开始和结束之间经过的所有时间中,开始和结束之间的累积增量保留值。这就是最终数据帧的样子

Start         End         Confidence     cum_delta_retention
0.000000    1.416666      0.319943      0.000642 + 0.000693
0.000000    1.416666      0.424269      0.000642 + 0.000693
0.000000    1.416666      0.605917      0.000642 + 0.000693
0.000000    1.416666      0.602294      0.000642 + 0.000693
0.000000    1.416666      0.562171      0.000642 + 0.000693
0.000000    1.416666      0.790947      0.000642 + 0.000693
0.000000    1.416666      0.545534      0.000642 + 0.000693
1.433333    3.616666      0.618783      0.000740
1.433333    3.616666      0.803730      0.000740
1.433333    3.616666      0.385044      0.000740
3.633333    7.700000      0.490057      0.000784 + 0.000825 + 0.000725 
3.633333    7.700000      0.685507      0.000784 + 0.000825 + 0.000725 
239.850000  340.716666    0.937618      0.000593 + 0.000557 + 0.000523 + 0.000489
239.850000  340.716666    0.829939      0.000593 + 0.000557 + 0.000523 + 0.000489
239.850000  340.716666    0.852264      0.000593 + 0.000557 + 0.000523 + 0.000489
239.850000  340.716666    0.820325      0.000593 + 0.000557 + 0.000523 + 0.000489

我希望有人可以帮助我弄清楚如何解决此问题。我正处于python学习的初期,不知道如何解决此问题。

谢谢!

1 个答案:

答案 0 :(得分:1)

这应该做到:

要获取所需值的映射,可以使用:

df1_map = df1.set_index('time_elapsed')['delta_retention'].to_dict()

哪个给你:

{0.05: 0.000642,
 0.07: 0.0006929999999999999,
 1.75: 0.00074,
 3.75: 0.000784,
 4.5: 0.000825,
 7.25: 0.000725,
 277.5: 0.000593,
 281.25: 0.000557,
 285.0: 0.000523,
 288.75: 0.000489}

现在,您可以创建所需的列,以映射介于StartEnd之间的值:

df2['cum_delta_retention'] = df2.apply(lambda x: ' + '.join([f'{v:.6f}' for k, v in df1_map.items() if k >= x.Start and k <= x.End]), axis=1)

哪个会给你:

         Start         End  Confidence                        cum_delta_retention
0     0.000000    1.416666    0.319943                        0.000642 + 0.000693
1     0.000000    1.416666    0.424269                        0.000642 + 0.000693
2     0.000000    1.416666    0.605917                        0.000642 + 0.000693
3     0.000000    1.416666    0.602294                        0.000642 + 0.000693
4     0.000000    1.416666    0.562171                        0.000642 + 0.000693
5     0.000000    1.416666    0.790947                        0.000642 + 0.000693
6     0.000000    1.416666    0.545534                        0.000642 + 0.000693
7     1.433333    3.616666    0.618783                                   0.000740
8     1.433333    3.616666    0.803730                                   0.000740
9     1.433333    3.616666    0.385044                                   0.000740
10    3.633333    7.700000    0.490057             0.000784 + 0.000825 + 0.000725
11    3.633333    7.700000    0.685507             0.000784 + 0.000825 + 0.000725
12  239.850000  340.716666    0.937618  0.000593 + 0.000557 + 0.000523 + 0.000489
13  239.850000  340.716666    0.829939  0.000593 + 0.000557 + 0.000523 + 0.000489
14  239.850000  340.716666    0.852264  0.000593 + 0.000557 + 0.000523 + 0.000489
15  239.850000  340.716666    0.820325  0.000593 + 0.000557 + 0.000523 + 0.000489