Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫-可以读取多索引列表,但无法设置它们_Python_Pandas_Multi Index - Fatal编程技术网

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

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

经过一些挖掘,问题在于两个数据帧的索引不是同一类型的

  • df_data
    的索引是一个(字符串,字符串),pandas在读取csv源文件时没有识别出第二个是日期,我也没有转换为datetime
  • df_full
    的索引是(string,pandas.Timestamp),第二个术语恰好被格式化为与
    df_data
    完全相同的字符串,因此我感到困惑
当给定一个类似字符串的日期时,pandas可以理解并找到正确的行,但当我试图给它赋值时,它似乎找不到它


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