我的两个数据帧是:
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
列,如果来自df2
的Time
高于或等于来自df
的Time
,则该列将填充来自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