Python 熊猫-可以读取多索引列表,但无法设置它们
我有两个数据帧,它们都具有相同级别的相同多索引(一个代码和一个日期)。第一个包含有数据的每一行(来自数据库提取),第二个是相同的数据帧,除了它包含所有键(每个产品的每个月) 为了更清楚一点,这里是第一个数据帧(Python 熊猫-可以读取多索引列表,但无法设置它们,python,pandas,multi-index,Python,Pandas,Multi Index,我有两个数据帧,它们都具有相同级别的相同多索引(一个代码和一个日期)。第一个包含有数据的每一行(来自数据库提取),第二个是相同的数据帧,除了它包含所有键(每个产品的每个月) 为了更清楚一点,这里是第一个数据帧(df_data): 这是第二个(df_full),从2012年1月到2015年1月的所有月份: BL0 BL1 BL2 BL3 Shipments Code Month ABC
df_data
):
这是第二个(df_full
),从2012年1月到2015年1月的所有月份:
BL0 BL1 BL2 BL3 Shipments
Code Month
ABC 2012-01-01 NaN NaN NaN NaN NaN
2012-02-01 NaN NaN NaN NaN NaN
2012-03-01 1000 1000 1000 1000 1000
2012-04-01 NaN NaN NaN NaN NaN
...
DEF 2014-07-01 NaN NaN NaN NaN NaN
2014-08-01 1000 1000 1000 1000 1000
2014-09-01 1000 1000 1000 1000 1000
2014-10-01 NaN NaN NaN NaN NaN
...
GHI 2013-12-01 1000 1000 1000 1000 1000
2014-10-01 1000 1000 1000 1000 1000
2014-12-01 1000 1000 1000 1000 1000
现在,我有了第一个,我正在尝试建立第二个。我用多索引创建了一个空数据框,创建了每一列,每一列都填充了NAN,我一直在将df_full
的值设置为df_data
中的值
当我这样做的时候
df_full.loc[ df_data.index, 'Shipments' ] = df_data['Shipments']
我得到一个错误,说df\u data
的索引不在df\u dull
:
KeyError: "[('ABC', '2012-03-01') ('DEF', '2014-08-01')\n ('DEF', '2014-09-01') ...,
('XYZ', '2014-11-01')\n ('XYZ', '2014-12-01')] not in index"
让我头疼的是,如果我只做df_full.loc[data.index,'shippings']
它会毫无问题地返回序列。我尝试使用元组列表而不是索引,还尝试将切片设置为1,但没有效果
我在这里做错了什么吗?如果你只想构造商品和天数的所有可能组合,你可以使用一个漂亮的内置iterable,
多索引。from_product
commodities=['ABC','DEF','GHI','JKL']
days=pd.date_range(start='1/1/2012',end='1/1/2015',freq='D')
columns = ['BL0', 'BL1','BL2', 'BL3','Shipments']
indx = pd.MultiIndex.from_product([commodities,days])
output = pd.DataFrame(index=indx,columns=columns)
output.head()
BL0 BL1 BL2 BL3 Shipments
ABC 2012-01-01 NaN NaN NaN NaN NaN
2012-01-02 NaN NaN NaN NaN NaN
2012-01-03 NaN NaN NaN NaN NaN
2012-01-04 NaN NaN NaN NaN NaN
2012-01-05 NaN NaN NaN NaN NaN
然后,根据多个索引的级别,可以适当地替换实际值。经过一些挖掘,问题在于两个数据帧的索引不是同一类型的
的索引是一个(字符串,字符串),pandas在读取csv源文件时没有识别出第二个是日期,我也没有转换为datetime李>df_data
的索引是(string,pandas.Timestamp),第二个术语恰好被格式化为与df_full
完全相同的字符串,因此我感到困惑df_data
将
df_data
的索引转换为(string,pandas.Timestamp)后,一切都很好。KeyError中的索引看起来很奇怪。里面有一个\n
?或者这是打印输出的伪品?还有,什么是data.index
?你提到了一个df_数据
和df_full
。data.index
是df_数据。index
,我编辑了这个问题来纠正这个问题。\n
可能与这个级别的索引是字符串而不是datetime这一事实有关,正如我在回答中提到的那样。
commodities=['ABC','DEF','GHI','JKL']
days=pd.date_range(start='1/1/2012',end='1/1/2015',freq='D')
columns = ['BL0', 'BL1','BL2', 'BL3','Shipments']
indx = pd.MultiIndex.from_product([commodities,days])
output = pd.DataFrame(index=indx,columns=columns)
output.head()
BL0 BL1 BL2 BL3 Shipments
ABC 2012-01-01 NaN NaN NaN NaN NaN
2012-01-02 NaN NaN NaN NaN NaN
2012-01-03 NaN NaN NaN NaN NaN
2012-01-04 NaN NaN NaN NaN NaN
2012-01-05 NaN NaN NaN NaN NaN