我有第一个数据帧df1
,如下所示。这里col_b
是h1和h24之间的任何数字,并且对于每个相应的日期不包含1到24的所有数字:
Date col_b
20101101 h1
20101101 h2
20101101 h3
20101102 h1
20101102 h3
20101103 h2
20101104 h1
20101105 h2
20101105 h3
20101106 h6
20101106 h8
20101106 h24
20101107 h15
第二个数据帧df2
为:
date h1 h2 h3 h4 h5 h6 ... h24
20101101 4 6 45 6 7 8 ... 5
20101102 .........................
20101103 .........................
我需要从df2
到df1
中的行与df2
中的位置匹配的列表中选择值。
目前,我正在使用iterrows
从df1
中选择行值,并将df2
中的值指定为
df2.loc[df2['Date] ==row[0], row[1]]
中的每一行df1
。
这是忙乱而且耗费大量时间。是否有pythonic或Pandas方法呢?
答案 0 :(得分:1)
使用DataFrame.lookup()
:
import numpy as np
import pandas as pd
df2 = pd.DataFrame(np.random.randint(0, 10, (5, 3)),
columns=list("ABC"),
index=pd.date_range("2016/01/01", "2016/05/01", freq="MS"))
df = pd.DataFrame({"date":df2.index[np.random.randint(0, 5, 10)],
"key": df2.columns[np.random.randint(0, 3, 10)]})
df["value"] = df2.lookup(df["date"], df["key"])
print(df)
结果:
date key value
0 2016-01-01 C 2
1 2016-05-01 A 8
2 2016-01-01 A 8
3 2016-04-01 B 1
4 2016-04-01 C 2
5 2016-03-01 A 2
6 2016-03-01 A 2
7 2016-04-01 B 1
8 2016-05-01 A 8
9 2016-03-01 B 5