Pandas可以读取多索引列表,但不能设置它们

2024-09-30 06:16:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个数据帧,它们都有相同的多索引和相同的级别(一个代码和一个日期)。第一个包含有数据的每一行(来自数据库提取),第二个是相同的数据帧,只是它包含所有的键(每个产品的每个月)。你知道吗

更清楚一点,这里是第一个数据帧(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创建了一个空的数据帧,创建了每一列,每一列都用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,但没有效果。你知道吗

我做错什么了吗?你知道吗


Tags: 数据dfdataindexdefcodenanfull
2条回答

经过一番挖掘,问题在于这两个数据帧的索引不属于同一类型。你知道吗

  • df_data的索引是a(string,string),pandas在读取csv源文件时没有意识到seconde是日期,我也没有转换为datetime。你知道吗
  • df_full的索引是(字符串,熊猫。时间戳),而第二个术语恰好被格式化为与df_data完全相同的字符串,因此我感到困惑。你知道吗

当给定一个像字符串这样的日期时,pandas可以理解并找到正确的行,但是当我试图给它赋值时,它似乎找不到它。你知道吗

df_data的索引转换为(字符串)后,熊猫。时间戳),一切正常。你知道吗

如果您只想构造商品和天数的所有可能组合,那么可以使用一个漂亮的内置iterable,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

然后,您可以根据多个索引的级别适当地替换实际值。你知道吗

相关问题 更多 >

    热门问题