首页 > 解决方案 > 根据其他数据框从数据框中选择值

问题描述

我尝试根据时间戳计算对象的位置。为此,我在熊猫中有两个数据框。一个用于测量数据,一个用于位置。所有的运动都是直接的加速。

数据框 1 包含测量数据:

        ms        force   ...    ...    ...
1      5           20
2      10          20
3      15          25
4      20          30
5      25          20
..... (~ 6000 lines)

数据框 2 包含“定位数据”

        ms        speed (m/s)
1      0           0.66
2      4500        0.66
3      8000        1.3
4      16000       3.0
5      20000       3.0
.....(~300 lines)

现在我想用来自第二个数据帧的数据计算第一个数据帧的位置在 Excel 中我通过使用数组公式解决了这个问题,但现在我必须使用 Python/Pandas,我无法找到一种方法如何从中选择正确的行数据框 2。

我的想法是做这样的事情:如果

最后我想显示一个图表“强制<->方式”而不是“强制<->时间”

谢谢你

==================================================== ======================== 更新:与此同时,我几乎可以解决我的问题。现在我的数据看起来像这样:

数据帧 2(速度数据):

        pos       v         a         t      t-end    t-start
0    -3.000    0.666667  0.000000  4.500000   4.500000   0.000000
1     0.000    0.666667  0.187037  0.071287   4.571287   4.500000
2     0.048    0.680000  0.650794  0.010244   4.581531   4.571287
3     0.055    0.686667  0.205432  0.064904   4.646435   4.581531
...
15    0.055    0.686667  0.5       0.064904     23.0     20.0
...
28    0.055    0.686667  0.6       0.064904     35.0     34.0
...
30    0.055    0.686667  0.9       0.064904     44.0     39.0

和 Dataframe 1(基于时间的测量):

        Fx     Fy     Fz      abs_t               expected output ('a' from DF1)
0      -13.9  170.3   45.0   0.005                            0.000000  
1      -14.1  151.6   38.2   0.010                            0.000000  
...
200    -14.1  131.4   30.4   20.015                           0.5
...
300    -14.3  111.9   21.1   34.01                            0.6
...
400    -14.5   95.6   13.2   40.025

所以我想检查来自 DF1 的时间(abs_t)并在 DF2 中搜索正确的“a”所以像这样(伪代码):

if (DF1['t_abs'] between (DF2['t-start'], DF2['t-end']):
    DF1['a'] = DF2['a']

我可以制作两个 for 循环,但它看起来像错误的方式并且非常慢。

我希望你能理解我的问题;提供运行样本非常困难。在 Excel 中,我确实是这样的: excel解决方案 数组公式

标签: pythonpandasdataframepython-3.7

解决方案


我找到了一个非常慢的解决方案,但至少它可以工作:(

df1['a'] = 0
for index, row in df2.iterrows():
    start = row['t-start']
    end = row ['t-end']
    a = row ['a']

    df1.loc[(df1['tabs']>start)&(df1['tabs']<end), 'a'] = a

推荐阅读