[英]Python: Reshaping a dataframe with multiple indexes
So imagine we have a DataFrame like this: 所以我们假设我们有一个像这样的DataFrame:
In[1]: operinc_df
Out[1] :
ticker1 ticker2 ticker3
0 0.343573 0.654719 0.246643
1 0.186861 0.219793 0.761056
2 0.417347 0.058368 0.684918
3 0.803177 0.014781 0.896704
4 0.294515 0.488001 0.291187
5 0.402278 0.368005 0.821096
6 0.985514 0.378000 0.929529
7 1.168360 0.729640 0.347064
8 0.025802 1.337121 0.638399
9 0.019182 2.257563 0.041164
And we have also another DataFrame with the same number of rows and of columns (with the same name): 我们还有另一个具有相同行数和列数(具有相同名称)的DataFrame:
In[2]: opex_df
Out[2] :
ticker1 ticker2 ticker3
0 1.450770 0.227986 2.243050
1 1.212298 0.406004 1.212320
2 0.918931 0.677043 0.361878
3 0.566981 1.155675 0.295542
4 0.600614 0.872015 1.129760
5 0.470118 0.730027 1.112045
6 1.489904 0.522885 0.475244
7 1.626853 0.142996 0.758590
8 0.290340 1.175891 0.591020
9 1.472838 0.107094 0.715764
What I cannot figure out is how could I create another DataFrame fundamentals
made of operinc_df
and opex_df
such that it looks like the DataFrame below (possibly with two levels of indexes): 我无法弄清楚的是我如何创建另一个由
operinc_df
和opex_df
组成的DataFrame fundamentals
,使其看起来像下面的DataFrame(可能有两级索引):
In[3]: fundamentals
Out[3] :
operinc_df opex_df
ticker1 0 0.343573 1.450770
ticker1 1 0.186861 1.212298
. . . .
. . . .
. . . .
ticker1 9 0.019182 1.472838
ticker2 0 0.654719 0.227986
ticker2 1 0.219793 0.406004
. . . .
. . . .
. . . .
ticker2 9 2.257563 0.107094
ticker3 0 0.246643 2.243050
ticker3 1 0.761056 1.212320
. . . .
. . . .
. . . .
ticker3 9 0.041164 0.715764
Reading Reshaping dataframes in pandas based on column labels and Create a pandas DataFrame from multiple dicts gave me some insights (because I was also trying to do it by converting the original DataFrames firstly to dicts, pack operinc_df
and opex_df
by keys with a dictionary comprehension, and then with pandas.DataFrame.from_dict()
try to create fundamentals_df
. Nevertheless, it did not work out for me so far. 阅读根据列标签重塑pandas中的数据帧并从多个dicts创建一个pandas DataFrame给了我一些见解(因为我还试图通过首先将原始DataFrame转换为
opex_df
,使用字典理解键将operinc_df
和opex_df
打包,然后用pandas.DataFrame.from_dict()
尝试创建fundamentals_df
pandas.DataFrame.from_dict()
。然而,到目前为止它对我来说并没有用。
Do you have any ideas on how I could do this correctly ? 你对我如何正确地做到这一点有什么想法吗? Thank you very much in advance.
非常感谢你提前。
You can concat the transposed dataframes, 您可以连接转置的数据帧,
new_df = pd.concat([operinc_df.T, opex_df.T], axis = 1, keys=['operinc_df', 'opex_df']).stack()
operinc_df opex_df
ticker1 0 0.343573 1.450770
1 0.186861 1.212298
2 0.417347 0.918931
3 0.803177 0.566981
4 0.294515 0.600614
5 0.402278 0.470118
6 0.985514 1.489904
7 1.168360 1.626853
8 0.025802 0.290340
9 0.019182 1.472838
ticker2 0 0.654719 0.227986
1 0.219793 0.406004
2 0.058368 0.677043
3 0.014781 1.155675
4 0.488001 0.872015
5 0.368005 0.730027
6 0.378000 0.522885
7 0.729640 0.142996
8 1.337121 1.175891
9 2.257563 0.107094
ticker3 0 0.246643 2.243050
1 0.761056 1.212320
2 0.684918 0.361878
3 0.896704 0.295542
4 0.291187 1.129760
5 0.821096 1.112045
6 0.929529 0.475244
7 0.347064 0.758590
8 0.638399 0.591020
9 0.041164 0.715764
You can do: 你可以做:
fundamentals = (operinc_df.stack().rename('operinc_df').to_frame()
.join(opex_df.stack().rename('opex_df'))
.swaplevel().sort_index())
>>> fundamentals
operinc_df opex_df
ticker1 0 0.343573 1.450770
1 0.186861 1.212298
2 0.417347 0.918931
3 0.803177 0.566981
4 0.294515 0.600614
5 0.402278 0.470118
6 0.985514 1.489904
7 1.168360 1.626853
8 0.025802 0.290340
9 0.019182 1.472838
ticker2 0 0.654719 0.227986
1 0.219793 0.406004
2 0.058368 0.677043
3 0.014781 1.155675
4 0.488001 0.872015
5 0.368005 0.730027
6 0.378000 0.522885
7 0.729640 0.142996
8 1.337121 1.175891
9 2.257563 0.107094
ticker3 0 0.246643 2.243050
1 0.761056 1.212320
2 0.684918 0.361878
3 0.896704 0.295542
4 0.291187 1.129760
5 0.821096 1.112045
6 0.929529 0.475244
7 0.347064 0.758590
8 0.638399 0.591020
9 0.041164 0.715764
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.