有没有一种方法可以通过索引另一个数据框中的值来从一个数据框中选择值

时间:2019-07-09 06:47:12

标签: python pandas dataframe datetime vlookup

我有2个数据帧,长度相同,但大小不同。

基本上,我想通过使用df1 ['Data1']中的值作为列输入来选择ref_df中的值。

下面,您可以看到我的解决方案,但是有没有一种方法可以不使用.ix或不使用for循环呢?另外,如果我的索引是日期时间索引而不是['11','12','13','14'],该怎么办?

    import pandas as pd 
    import numpy as np 


    data = {'21' : [1,2,3,4], '22' : [5,6,7,8], '23' : [9,10,11,12], '24' : [13,14,15,16]} 
    ref_df = pd.DataFrame(data, index=['11','12','13','14']) 
    df1 = pd.DataFrame({'Data': ['11','12','13','14'],'Data1': ['21','22','23','24']}) 

    for index, row in df1.iterrows(): 
        df1.ix[index, 'Derived'] = ref_df.iloc[ref_df.index.get_loc(row.Data), ref_df.columns.get_loc(row.Data1)]



df1   Data Data1
0   11    21
1   12    22
2   13    23
3   14    24
-----------
ref df     21  22  23  24
11   1   5   9  13
12   2   6  10  14
13   3   7  11  15
14   4   8  12  16
---------
df1   Data Data1  Derived
0   11    21      1.0
1   12    22      6.0
2   13    23     11.0
3   14    24     16.0
----------

1 个答案:

答案 0 :(得分:0)

如果columns中的df1按照ref_df indexcolumns的顺序排列,则可以将ref_df的对角线值取为:

df1['Derived'] = np.diag(ref_df)

print(df1)
  Data Data1  Derived
0   11    21        1
1   12    22        6
2   13    23       11
3   14    24       16

如果未对齐,请根据ref_df更改df1中的顺序并使用。

或直接使用lookup

df1['Derived'] = ref_df.lookup(df1['Data'], df1['Data1'])