Pandas - 可以读取 MultiIndex 列表但不能设置它们
Pandas - Can read list of MultiIndex but cannot set them
我有两个 DataFrame,它们具有相同的 multi-index 和相同的级别(一个代码和一个日期)。第一个包含有数据的每一行(从数据库提取),第二个是相同的 DataFrame,除了它包含所有键(每个产品的 horizon 的每个月)。
为了更清楚一点,这是第一个数据帧(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' ]
它 returns 系列赛就没有任何问题。我尝试使用元组列表而不是索引,我也尝试将切片设置为 1,但无济于事。
我是不是做错了什么?
如果你只是想构建商品和日期的所有可能组合,你可以使用一个很好的内置迭代器,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
然后您可以根据多指数的水平,适当地替换实际值。
经过一番挖掘,问题出在两个DataFrame的索引不是同一类型。
df_data
的index是一个(string, string),pandas读csv源文件的时候没认出seconde是日期,没转成约会时间。
df_full
的索引是 (string, pandas.Timestamp),而第二个术语恰好被格式化为与 df_data
完全相同的字符串,因此我感到困惑。
当给定一个类似日期的字符串时,pandas 可以理解并找到正确的行,但是当我试图为其赋值时它似乎找不到它。
将 df_data
的索引转换为 (string, pandas.Timestamp) 后,一切正常。
我有两个 DataFrame,它们具有相同的 multi-index 和相同的级别(一个代码和一个日期)。第一个包含有数据的每一行(从数据库提取),第二个是相同的 DataFrame,除了它包含所有键(每个产品的 horizon 的每个月)。
为了更清楚一点,这是第一个数据帧(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' ]
它 returns 系列赛就没有任何问题。我尝试使用元组列表而不是索引,我也尝试将切片设置为 1,但无济于事。
我是不是做错了什么?
如果你只是想构建商品和日期的所有可能组合,你可以使用一个很好的内置迭代器,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
然后您可以根据多指数的水平,适当地替换实际值。
经过一番挖掘,问题出在两个DataFrame的索引不是同一类型。
df_data
的index是一个(string, string),pandas读csv源文件的时候没认出seconde是日期,没转成约会时间。df_full
的索引是 (string, pandas.Timestamp),而第二个术语恰好被格式化为与df_data
完全相同的字符串,因此我感到困惑。
当给定一个类似日期的字符串时,pandas 可以理解并找到正确的行,但是当我试图为其赋值时它似乎找不到它。
将 df_data
的索引转换为 (string, pandas.Timestamp) 后,一切正常。