使用pandas数据帧中的两行来选择另一个数据帧中的位置

时间:2016-10-09 00:38:24

标签: python pandas dataframe

我有第一个数据帧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    .........................

我需要从df2df1中的行与df2中的位置匹配的列表中选择值。

目前,我正在使用iterrowsdf1中选择行值,并将df2中的值指定为      df2.loc[df2['Date] ==row[0], row[1]]中的每一行df1

这是忙乱而且耗费大量时间。是否有pythonic或Pandas方法呢?

1 个答案:

答案 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