Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Pandas-发布多索引数据帧_Python_Pandas_Dataframe_Concat_Multi Index - Fatal编程技术网

Python Pandas-发布多索引数据帧

Python Pandas-发布多索引数据帧,python,pandas,dataframe,concat,multi-index,Python,Pandas,Dataframe,Concat,Multi Index,我正在尝试合并两个多索引数据帧。我的代码如下。正如您在输出中所看到的,问题在于“DATE”索引是重复的,而我希望所有值(OPEN_INT,PX_LAST)都位于同一个日期索引上。。。有什么想法吗?我尝试了append和concat,但都得到了相似的结果 if df.empty: df = bbg_historicaldata(t, f, startDate, endDate) print(df)

我正在尝试合并两个多索引数据帧。我的代码如下。正如您在输出中所看到的,问题在于“DATE”索引是重复的,而我希望所有值(OPEN_INT,PX_LAST)都位于同一个日期索引上。。。有什么想法吗?我尝试了append和concat,但都得到了相似的结果

      if df.empty:
            df = bbg_historicaldata(t, f, startDate, endDate)
            print(df)            
            datesArray = list(df.index)
            tArray = [t for i in range(len(datesArray))]
            arrays = [tArray, datesArray]
            tuples = list(zip(*arrays))
            index = pd.MultiIndex.from_tuples(tuples, names=['TICKER', 'DATE'])                    
            df = pd.DataFrame({f : df[f].values}, index=index)
    else:
        temp = bbg_historicaldata(t,f,startDate,endDate)
            print(temp)
            datesArray = list(temp.index)
            tArray = [t for i in range(len(datesArray))]
            arrays = [tArray, datesArray]
            tuples = list(zip(*arrays))
            index = pd.MultiIndex.from_tuples(tuples, names=['TICKER', 'DATE'])


            temp = pd.DataFrame({f : temp[f].values}, index=index)

            #df = df.append(temp, ignore_index = True)
            df = pd.concat([df, temp], axis = 1).sortlevel()
根本不想要楠的

                        PX_LAST   OPEN_INT  PX_LAST  OPEN_INT  PX_LAST  \
TICKER      DATE                                                         
EDH8 COMDTY 2017-02-01   98.365  1008044.0      NaN       NaN      NaN   
            2017-02-02   98.370  1009994.0      NaN       NaN      NaN   
            2017-02-03   98.360  1019181.0      NaN       NaN      NaN   
            2017-02-06   98.405  1023863.0      NaN       NaN      NaN   
            2017-02-07   98.410  1024609.0      NaN       NaN      NaN   
            2017-02-08   98.435  1046258.0      NaN       NaN      NaN   
            2017-02-09   98.395  1050291.0      NaN       NaN      NaN   
EDM8 COMDTY 2017-02-01      NaN        NaN   98.245  726739.0      NaN   
            2017-02-02      NaN        NaN   98.250  715081.0      NaN   
            2017-02-03      NaN        NaN   98.235  723936.0      NaN   
            2017-02-06      NaN        NaN   98.285  729324.0      NaN   
            2017-02-07      NaN        NaN   98.295  728673.0      NaN   
            2017-02-08      NaN        NaN   98.325  728520.0      NaN   
            2017-02-09      NaN        NaN   98.280  741840.0      NaN   
EDU8 COMDTY 2017-02-01      NaN        NaN      NaN       NaN   98.130   
            2017-02-02      NaN        NaN      NaN       NaN   98.135   
            2017-02-03      NaN        NaN      NaN       NaN   98.120   
            2017-02-06      NaN        NaN      NaN       NaN   98.180   
            2017-02-07      NaN        NaN      NaN       NaN   98.190   
            2017-02-08      NaN        NaN      NaN       NaN   98.225   
            2017-02-09      NaN        NaN      NaN       NaN   98.175  
编辑:执行Axis=0,给出以下内容:。我希望它折叠重复的日期(即,每个日期索引都有唯一的值,没有重复的天数或N)

这是打印的输入数据。我在上面添加了print(df)和print(temp)。它们都是以日期为索引的数据帧。股票代码索引来自循环“for f in fields:”中的变量“f”:


您的逻辑有点难以理解(例如,很难理解为什么有时您会从数据调用中获得不同的列)。不过,实际上,您只需要使用相同的ticker(如果您将索引设置为ticker,DATE)在所有帧之间执行
连接
,或者如果ticker和DATE是列,则执行
合并
,然后连接这些帧的结果。它试图在一个步骤中实现这两个目标,这导致了问题的出现

或者,我们可以把整个事情浓缩,然后旋转,这就是我在这里要做的,因为它更容易展示

(顺便说一句,在循环中重复连接可能是一个性能问题,因为每次都需要复制大量数据,通常应该避免——首先构建一个要连接的数据集合,然后应用该集合。)


假设您的每个帧开始如下所示(其中列可能不同):

然后,与您现在所做的不同,我只需将股票代码添加到帧并重置索引:

In [549]: df = df.assign(TICKER=t).reset_index()   #TICKER variable = t
Out[549]: 
         DATE  PX_LAST       TICKER
0  2017-02-01   98.365  EDH8 COMDTY
1  2017-02-02   98.370  EDH8 COMDTY
2  2017-02-03   98.360  EDH8 COMDTY
3  2017-02-06   98.405  EDH8 COMDTY
4  2017-02-07   98.410  EDH8 COMDTY
5  2017-02-08   98.435  EDH8 COMDTY
6  2017-02-09   98.395  EDH8 COMDTY
为了使串联更便于记忆,让我们将其融化:

In [579]: pd.melt(df, id_vars=["TICKER", "DATE"])
Out[579]: 
        TICKER        DATE variable   value
0  EDH8 COMDTY  2017-02-01  PX_LAST  98.365
1  EDH8 COMDTY  2017-02-02  PX_LAST  98.370
2  EDH8 COMDTY  2017-02-03  PX_LAST  98.360
3  EDH8 COMDTY  2017-02-06  PX_LAST  98.405
4  EDH8 COMDTY  2017-02-07  PX_LAST  98.410
5  EDH8 COMDTY  2017-02-08  PX_LAST  98.435
6  EDH8 COMDTY  2017-02-09  PX_LAST  98.395
并将其附加到列表
dfs
。现在,部分帧将很好地结合在一起,因为它们都有相同的列,我们可以旋转以获得所需的输出:

In [589]: pd.concat(dfs).pivot_table(index=["TICKER", "DATE"], columns="variable", values="value")
Out[589]: 
variable                 OPEN_INT  PX_LAST
TICKER      DATE                          
EDH8 COMDTY 2017-02-01  1008044.0   98.365
            2017-02-02  1009994.0   98.370
            2017-02-03  1019181.0   98.360
            2017-02-06  1023863.0   98.405
[...]

这避免了所有这些中间NAN。因为连接+枢轴方法即使不熔化也能工作,一开始我没有熔化,但是经过再三考虑,拥有这些中间的NAN是个坏主意,即使它能工作,因为中间内存需求可能会增长到令人望而却步的程度。

TICKER索引值是不同的。是否要忽略/删除该索引级别?期望的结果是什么?所以基本上我希望有一个多索引的数据帧。第一个索引是股票代码。下一个索引是日期。然后是PX_LAST和OPEN_INT列。对于每个ticker,都会有时间序列数据,但所有ticker都将共享相同的列。与其只显示输出,不如显示开始的内容,这样人们可以进行实验。我怀疑你让这件事变得更难了。当然,一秒钟。我将添加编辑。你是一个传奇,谢谢DSM!出于好奇,为什么拥有大量的列会改变你处理这个问题的方式?@keynesiancross:你拥有的列(或行)越多,你中间的预透视数据帧就越多。这意味着您可以在内存中拥有一个巨大的中间帧,即使最终版本要小很多倍。事实上,我实际上要改变我的建议的顺序,这样就不会让其他人走上这条路。事实上,现在我在想,如果你在循环之外做concat(dfs)。pivot_table()的话,你会得到所有那些NaN吗?也就是说,您将构建一个df列表,其中只包含日期,并且完全归档在列数据中。NaN只是我原创作品的副产品code@keynesiancross:是的,它们出现了,基本上是因为concat仍然尝试将只有OPEN_INT的子帧与最后只有PX_的子帧组合在一起。
In [549]: df = df.assign(TICKER=t).reset_index()   #TICKER variable = t
Out[549]: 
         DATE  PX_LAST       TICKER
0  2017-02-01   98.365  EDH8 COMDTY
1  2017-02-02   98.370  EDH8 COMDTY
2  2017-02-03   98.360  EDH8 COMDTY
3  2017-02-06   98.405  EDH8 COMDTY
4  2017-02-07   98.410  EDH8 COMDTY
5  2017-02-08   98.435  EDH8 COMDTY
6  2017-02-09   98.395  EDH8 COMDTY
In [579]: pd.melt(df, id_vars=["TICKER", "DATE"])
Out[579]: 
        TICKER        DATE variable   value
0  EDH8 COMDTY  2017-02-01  PX_LAST  98.365
1  EDH8 COMDTY  2017-02-02  PX_LAST  98.370
2  EDH8 COMDTY  2017-02-03  PX_LAST  98.360
3  EDH8 COMDTY  2017-02-06  PX_LAST  98.405
4  EDH8 COMDTY  2017-02-07  PX_LAST  98.410
5  EDH8 COMDTY  2017-02-08  PX_LAST  98.435
6  EDH8 COMDTY  2017-02-09  PX_LAST  98.395
In [589]: pd.concat(dfs).pivot_table(index=["TICKER", "DATE"], columns="variable", values="value")
Out[589]: 
variable                 OPEN_INT  PX_LAST
TICKER      DATE                          
EDH8 COMDTY 2017-02-01  1008044.0   98.365
            2017-02-02  1009994.0   98.370
            2017-02-03  1019181.0   98.360
            2017-02-06  1023863.0   98.405
[...]