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