使用来自另一个数据帧的代码重新索引数据帧

Posted

技术标签:

【中文标题】使用来自另一个数据帧的代码重新索引数据帧【英文标题】:Reindex a dataframe using tickers from another dataframe 【发布时间】:2021-09-22 16:42:38 【问题描述】:

我使用将 csv 文件读入数据框

from glob import glob
import pandas as pd

def read_file(f):
    df = pd.read_csv(f)
    df['ticker'] = f.split('.')[0]
    return df


df = pd.concat([read_file(f) for f in glob('*.csv')])
df = df.set_index(['Date','ticker'])[['Close']].unstack()

并得到以下数据框:

                 Close                                                    
ticker            AAPL        AMD        BIDU        GOOGL          IXIC   
Date                                                                       
2011-06-01   12.339643   8.370000  132.470001   263.063049   2769.189941
.
.
.   

现在我想使用'ticker' 重新索引另一个由

创建的随机数据帧
data = np.random.random((df.shape[1], 100))
df1 = pd.DataFrame(data)

看起来像:

          0         1         2         3         4         5         6   \...
0   0.493036  0.114539  0.862388  0.156381  0.030477  0.094902  0.132268   
1   0.486184  0.483585  0.090874  0.751288  0.042761  0.150361  0.781567   
2   0.318586  0.078662  0.238091  0.963334  0.815566  0.274273  0.320380   
3   0.708489  0.354177  0.285239  0.565553  0.212956  0.275228  0.597578   
4   0.150210  0.423037  0.785664  0.956781  0.894701  0.707344  0.883821   
5   0.005920  0.115123  0.334728  0.874415  0.537229  0.557406  0.338663   
6   0.066458  0.189493  0.887536  0.915425  0.513706  0.628737  0.132074   
7   0.729326  0.241142  0.574517  0.784602  0.287874  0.402234  0.926567   
8   0.284867  0.996575  0.002095  0.325658  0.525330  0.493434  0.701801   
9   0.355176  0.365045  0.270155  0.681947  0.153718  0.644909  0.952764   
10  0.352828  0.557434  0.919820  0.952302  0.941161  0.246068  0.538714   
11  0.465394  0.101752  0.746205  0.897994  0.528437  0.001023  0.979411   

我试过了

df1 = df1.set_index(df.columns.values)

但我的df 似乎只有一级索引,因为错误提示

IndexError: Too many levels: Index has only 1 level, not 2

但是,如果我通过df.index 检查索引,它会给我Date,有人可以帮我解决这个问题吗?

【问题讨论】:

试试df1.set_index(df.droplevel(0,1).columns.tolist()) 【参考方案1】:

您可以通过MultiIndex.get_level_values获取df中MultiIndex特定级别的列标签,如下:

df_ticker = df.columns.get_level_values('ticker')

那么,如果df1的列数相同,则可以通过以下方式将提取的标签复制到df1

df1.columns = df_ticker

【讨论】:

以上是关于使用来自另一个数据帧的代码重新索引数据帧的主要内容,如果未能解决你的问题,请参考以下文章

如何使用来自另一个数据帧的索引创建考拉数据帧?

重新索引 MultiIndex 数据帧的特定级别

使用来自另一个数据帧的值更新数据帧标头

(运行的干净代码)根据来自另一个数据帧的日期间隔和字符串条件获取一个数据帧中的值的平均值

缓存后正在重新评估 Spark 数据帧

将 MultiIndex Pandas 数据帧乘以来自另一个数据帧的多个标量