Python: 在另一个数据帧的header中查找值和replace/map对应的值

Python: Lookup value in header of another data frame and replace/map the corresponding value

我有一个包含索引成员的数据框,如下所示(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

我还有第二个 table 包括例如价格:

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

目标是用 df_prices 中的价格替换 df1 中的所有公司名称,结果是 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 个小时。

我已经尝试使用 merge/join、地图或查找功能,但无法解决问题。

我的方法如下:

# 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])]

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

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