PythonPandas - 2个多索引DataFrames在视觉上是一样的,但不相等?

问题描述 投票:0回答:1

我正在使用2种方法来馈送一个多索引的pandas DataFrame。

  • 一种是用值来初始化它

  • 一行一行地填满它(我不在乎速度,我必须这样做,因为我每一行都是经过不同的计算后才有新的行,而不是一次就填满的)。

拜托,这两个DataFrames'看起来'是一样的,但pandas告诉我它们不是一样的。

 import attr
 import pandas as pd

 @attr.s(frozen=True)
 class CDE(object):
     name : str = attr.ib()
     def __str__(self):
         return self.name

 # Method 1: filling it row per row.
 rmidx = pd.MultiIndex(levels=[[],[]], codes=[[],[]], names=['CDE','period'])
 c_array = [['Column', 'Column'],['First', 'Last']]
 cmidx = pd.MultiIndex.from_arrays(c_array)
 summary1 = pd.DataFrame(index = rmidx, columns=cmidx)
 mcde1 = CDE(name='hi')
 mcde2 = CDE(name='ho')
 values = [[20,30],[40,50]]
 period = '5m'
 summary1.loc[(mcde1, period),('Column',)]=values[0]
 summary1.loc[(mcde2, period),('Column',)]=values[1]

 # Method 2: all at once.
 columns = summary1.columns
 rows = summary1.index.names
 index_label = [[mcde1,mcde2],[period,period]]
 summary2 = pd.DataFrame(values, index=index_label, columns=columns)
 summary2.index.names = rows

 In [2]:summary1
 Out[2]: 
            Column     
             First Last
 CDE period            
 hi  5m         20   30
 ho  5m         40   50

 In [3]:summary2
 Out[3]: 
            Column     
             First Last
 CDE period            
 hi  5m         20   30
 ho  5m         40   50

 summary1.equals(summary2)
 False

为什么会这样呢,谢谢大家的建议。

python pandas multi-index
1个回答
3
投票

从文档中 This function requires that the elements have the same dtype as their respective elements in the other Series or DataFrame. 但如果你这样做

summary1.dtypes, summary2.dtypes

你会得到

(Column  First    object
         Last     object
 dtype: object,
 Column  First    int64
         Last     int64
 dtype: object)

这是因为当你创建一个空的数据框时

summary1 = pd.DataFrame(index = rmidx, columns=cmidx)

默认 dtypeobject. 因此,每当你添加一条新的记录时,数据会被转换为给定的掩码。dtype. 另一方面,如果你用给定的数据创建一个数据框架。pandas 讨个好彩头 dtype,在这种情况下 int64.

© www.soinside.com 2019 - 2024. All rights reserved.