我有两个DataFrame,它们都具有相同级别的相同多索引(代码和日期)。第一行包含存在数据的每一行(来自数据库提取),第二行包含相同的DataFrame,但它包含所有键(每个产品的每个月都有)。
为了更清楚一点,这是第一个数据帧(df_data
):
BL0 BL1 BL2 BL3 Shipments
Code Month
ABC 2012-03-01 1000 1000 1000 1000 1000
DEF 2014-08-01 1000 1000 1000 1000 1000
2014-09-01 1000 1000 1000 1000 1000
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
这是第二个(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
现在,我有第一个,我正在尝试构建第二个。我使用MultiIndex创建了一个空的DataFrame,创建了每个填充了NaN的列,但我仍然坚持将df_full
的值设置为df_data
中的值。
当我这样做时
df_full.loc[ df_data.index, 'Shipments' ] = df_data['Shipments']
我收到错误消息,指出df_data
的索引不在df_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, 'Shipments' ]
,它会毫无问题地返回系列。我尝试使用元组列表而不是索引,我也尝试将切片设置为1,但无济于事。
我在这里做错了吗?
答案 0 :(得分:0)
如果您只想构建所有可能的商品和日期组合,您可以使用一个很好的内置迭代,MultiIndex.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
然后,您可以根据多指数的水平适当地替换实际值。
答案 1 :(得分:0)
经过一番挖掘后,问题变成了两个DataFrame索引的类型不同。
df_data
的索引是(字符串,字符串),并且pandas没有认识到seconde是读取csv源文件的日期而我没有转换到了约会时间。 df_full
索引是(string,pandas.Timestamp),第二个术语恰好被格式化为与df_data
完全相同的字符串,因此我感到困惑。当给出类似日期的字符串时,pandas可以理解并找到正确的行,但在我尝试为其分配值时似乎无法找到它。
将df_data
的索引转换为(string,pandas.Timestamp)后,一切都运行良好。