【问题标题】:Is there a way to select values from a dataframe by indexing with values from another dataframe [duplicate]有没有办法通过索引另一个数据帧中的值来从数据帧中选择值[重复]
【发布时间】:2019-07-09 06:47:12
【问题描述】:

我有 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
----------

【问题讨论】:

    标签: python pandas dataframe datetime vlookup


    【解决方案1】:

    如果columnsdf1 是按照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
    

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

    或者直接使用lookup

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

    【讨论】:

    • ref_df 中的值是随机的,不能对齐对角线。在这种情况下,这不是故意的。
    • @hyrian 检查更新。
    • 谢谢!!这正是我想要做的,甚至可以使用日期时间索引!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 2015-07-20
    • 1970-01-01
    • 2017-04-20
    • 1970-01-01
    • 2014-05-04
    • 2020-03-13
    相关资源
    最近更新 更多