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

标签 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

我还有第二张 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、map或lookup函数,但都无法解决问题。

我的方法如下:

# 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

关于Python:在另一个数据框的标题中查找值并替换/映射相应的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43700731/

相关文章:

python - 如何从大型 python 数据框中的复杂字符串中提取数字

python - 为什么PyGame动画闪烁

python - 在 python 中处理非常小的数字

python - 当存在缺失值时如何旋转和重命名连接级别列?

python - 将列添加到数据透视表( Pandas )

python - 当列中的值发生变化时,在 Python 数据框中插入空白行?

Python Pandas 和正则表达式使用字典替换 Dataframe 中的项目

Python:减少精度 Pandas 时间戳数据帧

python - 如何使用python转换csv文件中文件夹中的多个xml文件?

python - keras中多标签图像的一种热编码