在比较条件下,将列从另一个数据帧附加/联接到数据帧-不是精确的值



我的两个数据帧是:

df:

Time
0    0.0
1    0.3
2    0.6
3    0.9
4    1.2
5    1.5
6    1.8
7    2.1
8    2.4
9    2.7
10   3.0
11   3.3
12   3.6
13   3.9
14   4.2
15   4.5
16   4.8

df2:

Time  Value
0     0      6
1     1      8
2     2      9
3     3      6

我的代码是:

import pandas as pd
import numpy as np
df=pd.DataFrame(np.arange(0, 5, 0.3), columns=['Time'])
df2 = pd.DataFrame({'Time': [0, 1, 2, 3], 'Value': [6, 8, 9, 6]})
print(df)
print(df2)
df["Value"] = np.nan
for t1, t2, v in zip(df2["Time"].values[:-1], df2["Time"].values[1:], df2["Value"].values[:-1]):
df.loc[(df["Time"] >= t1) & (df["Time"] < t2), "Value"] = v

print(df)

我的目标是在df中创建新的Value列,如果来自df2Time高于或等于来自dfTime,则该列将填充来自df2的值。

预期输出为:

Time  Value
0    0.0    6.0
1    0.3    6.0
2    0.6    6.0
3    0.9    6.0
4    1.2    8.0
5    1.5    8.0
6    1.8    8.0
7    2.1    9.0
8    2.4    9.0
9    2.7    9.0
10   3.0    6.0
11   3.3    6.0
12   3.6    6.0
13   3.9    6.0
14   4.2    6.0
15   4.5    6.0
16   4.8    6.0

我该怎么做?目前的输出是:

Time  Value
0    0.0    6.0
1    0.3    6.0
2    0.6    6.0
3    0.9    6.0
4    1.2    8.0
5    1.5    8.0
6    1.8    8.0
7    2.1    9.0
8    2.4    9.0
9    2.7    9.0
10   3.0    NaN
11   3.3    NaN
12   3.6    NaN
13   3.9    NaN
14   4.2    NaN
15   4.5    NaN
16   4.8    NaN

看起来您可以在此处使用pd.merge_asof

pd.merge_asof(df, df2.astype({'Time':float}))
Time  Value
0    0.0      6
1    0.3      6
2    0.6      6
3    0.9      6
4    1.2      8
5    1.5      8
6    1.8      8
7    2.1      9
8    2.4      9
9    2.7      9
10   3.0      6
11   3.3      6
12   3.6      6
13   3.9      6
14   4.2      1
15   4.5      1
16   4.8      1

很难使用广播,我认为在这种情况下使用for循环更合适。

这是示例代码。

df["Value"] = np.nan
for t1, t2, v in zip(df2["Time"].values[:-1], df2["Time"].values[1:], df2["Value"].values[:-1]):
df.loc[(df["Time"] >= t1) & (df["Time"] < t2), "Value"] = v

结果如下。

display(df)
Time    Value
0   0.0 6.0
1   0.3 6.0
2   0.6 6.0
3   0.9 6.0
4   1.2 8.0
5   1.5 8.0
6   1.8 8.0
7   2.1 9.0
8   2.4 9.0
9   2.7 9.0
10  3.0 6.0
11  3.3 6.0
12  3.6 6.0
13  3.9 6.0
14  4.2 1.0
15  4.5 1.0
16  4.8 1.0

最新更新