我正在使用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
为什么会这样呢,谢谢大家的建议。
从文档中 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)
默认 dtype
是 object
. 因此,每当你添加一条新的记录时,数据会被转换为给定的掩码。dtype
. 另一方面,如果你用给定的数据创建一个数据框架。pandas
讨个好彩头 dtype
,在这种情况下 int64
.