【问题标题】:Pandas - Can read list of MultiIndex but cannot set themPandas - 可以读取 MultiIndex 列表但不能设置它们
【发布时间】:2016-01-19 20:02:12
【问题描述】:

我有两个 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,但无济于事。

我在这里做错了吗?

【问题讨论】:

  • KeyError 中的索引看起来很奇怪。 \n 在那里?或者这是打印输出的人工制品?
  • 另外,data.index 是什么?你只提到了df_datadf_full
  • data.indexdf_data.index,我编辑了这个问题来纠正这个问题。正如我在回答中提到的那样,\n 可能与这一级别的索引是字符串而不是日期时间有关。

标签: python pandas multi-index


【解决方案1】:

经过一番挖掘,问题出在两个DataFrame的索引类型不同。

  • df_data 的索引是一个(字符串,字符串),pandas 在读取 csv 源文件时没有识别出 seconde 是一个日期,我也没有转换为 datetime。
  • df_full 的索引是 (string, pandas.Timestamp),而第二个词恰好被格式化为与 df_data 完全相同的字符串,因此我感到困惑。

当给定一个类似日期的字符串时,pandas 可以理解并找到正确的行,但是当我尝试为其赋值时,它似乎找不到它。

df_data的索引转换为(字符串,pandas.Timestamp)后,一切正常。

【讨论】:

    【解决方案2】:

    如果您只想构建商品和日期的所有可能组合,您可以使用一个不错的内置迭代器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
    

    然后,您可以根据多指标的水平适当替换实际值。

    【讨论】:

      猜你喜欢
      • 2014-10-14
      • 2018-02-02
      • 2015-10-20
      • 2012-10-14
      • 2018-07-01
      • 2018-01-26
      • 1970-01-01
      • 2018-09-24
      • 1970-01-01
      相关资源
      最近更新 更多