设置多索引DataFrame的类型(dtypes)

时间:2019-06-22 21:24:09

标签: python pandas

说我得到了这个多索引DataFrame

>>> df = pandas.DataFrame(index=range(3), columns=pandas.MultiIndex.from_product(
        (('A', 'B'), ('C', 'D'), ('E', 'F'))))
>>> df
     A                   B                                                                             
     C         D         C         D                                                                   
     E    F    E    F    E    F    E    F                                                              
0  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN                                                              
1  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN                                                              
2  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
>>> df.dtypes                                                                                          
A  C  E    object                                                                                      
      F    object                                                                                      
   D  E    object                                                                                      
      F    object                                                                                      
B  C  E    object                                                                                      
      F    object                                                                                      
   D  E    object                                                                                      
      F    object 

如何将所有列E设置为float64并将所有列F设置为int64的类型?即,以便df.dtypes返回以下内容:

A  C  E    float64                                                                                      
      F    int64                                                                                      
   D  E    float64                                                                                      
      F    int64                                                                                      
B  C  E    float64                                                                                      
      F    int64                                                                                      
   D  E    float64                                                                                      
      F    int64

我了解DataFrame.astype,它对单索引DataFrame的效果很好,但是我如何将其与多索引结合使用?在实际代码中,列数要高得多:仍然是三个级别,但列数达到数百万。

尽管找不到答案,但我一直在搜索网络和文档。感觉好像我对DataFrame概念有误解,而且想要自己想要的东西是错误的。

提前谢谢!

1 个答案:

答案 0 :(得分:2)

较早的版本不支持NaN的整数列,但是从v0.24开始,您可以使用可为null的dtype。使用pd.IndexSlice选择列切片,然后像这样设置类型:

pd.__version__
# '0.24.2'

for cval, dtype in [('E', 'float64'), ('F', 'Int64')]:
    df.loc[:, pd.IndexSlice[:, :,cval]] = (
        df.loc[:, pd.IndexSlice[:, :,cval]].astype(dtype))

df.dtypes
A  C  E    float64
      F      Int64
   D  E    float64
      F      Int64
B  C  E    float64
      F      Int64
   D  E    float64
      F      Int64
dtype: object

请注意,I中的Int64大写表示Nullable Integer Type