Python:在另一个数据框的标题中查找值并替换/映射相应的值

时间:2017-04-29 21:36:53

标签: python pandas dataframe lookup

我有一个数据框,其索引成员看起来像这样(A,B,C,...是公司名称):

df_members

        Date  1  2  3  4
0 2016-01-01  A  B  C  D
1 2016-01-02  B  C  D  E
2 2016-01-03  C  D  E  F
3 2016-01-04  F  A  B  C
4 2016-01-05  B  C  D  E
5 2016-01-06  A  B  C  D

我有第二张表,包括例如价格:

df_prices

         Date   A   B   C   D   E   F
0  2015-12-30   1   2   3   4   5   6
1  2015-12-31   7   8   9  10  11  12
2  2016-01-01  13  14  15  16  17  18
3  2016-01-02  20  21  22  23  24  25
4  2016-01-03  27  28  29  30  31  32
5  2016-01-04  34  35  36  37  38  39
6  2016-01-05  41  42  43  44  45  46
7  2016-01-06  48  49  50  51  52  53

目标是将df1中的所有公司名称替换​​为df_prices的价格,从而产生df_result:

df_result

         Date   1   2   3   4 
0  2016-01-01  13  14  15  16
1  2016-01-02  21  22  23  24
2  2016-01-03  29  30  31  32
3  2016-01-04  39  34  35  36
4  2016-01-05  42  43  44  45
5  2016-01-06  48  49  50  51

我已经有了一个解决方案,我遍历df_members中的所有单元格,在df_prices中查找值并将它们写入新的数据框df_result中。问题是我的数据框非常大,这个过程大约需要7个小时。

我已经尝试使用合并/连接,地图或查找功能,但它无法解决问题。

我的方法如下:

# Create new dataframes
df_result = pd.DataFrame(columns=df_members.columns, index=unique_dates_list)

# Load prices
df_prices = prices

# Search ticker & write values in new dataframe
for i in range(0,len(df_members)):
    for j in range(0,len(df_members.columns)):
        if str(df_members.iloc[i, j]) != 'nan' and df_members.iloc[i, j] in df_prices.columns:
            df_result.iloc[i, j] = df_prices.iloc[i, df_prices.columns.get_loc(df_members.iloc[i, j])]

问题:有没有办法更有效地映射值?

1 个答案:

答案 0 :(得分:1)

pandas.lookup()将满足您的需求:

<强>代码:

df_result = pd.DataFrame(columns=[], index=df_members.index)
for column in df_members.columns:
    df_result[column] = df_prices.lookup(
        df_members.index, df_members[column])

测试代码:

import pandas as pd

df_members = pd.read_fwf(StringIO(
    u"""
          Date  1  2  3  4
    2016-01-01  A  B  C  D
    2016-01-02  B  C  D  E
    2016-01-03  C  D  E  F
    2016-01-04  F  A  B  C
    2016-01-05  B  C  D  E
    2016-01-06  A  B  C  D"""
), header=1).set_index('Date')

df_prices = pd.read_fwf(StringIO(
    u"""
          Date   A   B   C   D   E   F
    2015-12-30   1   2   3   4   5   6
    2015-12-31   7   8   9  10  11  12
    2016-01-01  13  14  15  16  17  18
    2016-01-02  20  21  22  23  24  25
    2016-01-03  27  28  29  30  31  32
    2016-01-04  34  35  36  37  38  39
    2016-01-05  41  42  43  44  45  46
    2016-01-06  48  49  50  51  52  53"""
), header=1).set_index('Date')

df_result = pd.DataFrame(columns=[], index=df_members.index)
for column in df_members.columns:
    df_result[column] = df_prices.lookup(
        df_members.index, df_members[column])

print(df_result)

<强>结果:

             1   2   3   4
Date                      
2016-01-01  13  14  15  16
2016-01-02  21  22  23  24
2016-01-03  29  30  31  32
2016-01-04  39  34  35  36
2016-01-05  42  43  44  45
2016-01-06  48  49  50  51