设置pandas中现有数据框的多索引

use*_*975 34 python pandas

我有一个DataFrame看起来像

  Emp1    Empl2           date       Company
0    0        0     2012-05-01         apple
1    0        1     2012-05-29         apple
2    0        1     2013-05-02         apple
3    0        1     2013-11-22         apple
18   1        0     2011-09-09        google
19   1        0     2012-02-02        google
20   1        0     2012-11-26        google
21   1        0     2013-05-11        google
Run Code Online (Sandbox Code Playgroud)

我想通过公司和日期设置MultiIndex为这个DataFrame.目前它有一个默认索引.我在用df.set_index(['Company', 'date'], inplace=True)

df = pd.DataFrame()
for c in company_list:
        row = pd.DataFrame([dict(company = '%s' %s, date = datetime.date(2012, 05, 01))])
        df = df.append(row, ignore_index = True)
        for e in emp_list:
            dataset  = pd.read_sql("select company, emp_name, date(date), count(*) from company_table where  = '"+s+"' and emp_name = '"+b+"' group by company, date, name LIMIT 5 ", con)
                if len(dataset) == 0:
                row = pd.DataFrame([dict(sitename='%s' %s, name = '%s' %b, date = datetime.date(2012, 05, 01), count = np.nan)])
                dataset = dataset.append(row, ignore_index=True)
            dataset = dataset.rename(columns = {'count': '%s' %b})
            dataset = dataset.groupby(['company', 'date', 'emp_name'], as_index = False).sum()

            dataset = dataset.drop('emp_name', 1)
            df = pd.merge(df, dataset, how = '')
            df = df.sort('date', ascending = True)
            df.fillna(0, inplace = True)

df.set_index(['Company', 'date'], inplace=True)            
print df
Run Code Online (Sandbox Code Playgroud)

但是当我打印它时DataFrame,它会打印出来None.我从stackoverflow中看到了这个解决方案.这不是正确的做法.此外,我想改组列公司和日期的位置,以便公司成为第一个索引,日期成为层次结构中的第二个.有什么想法吗?

And*_*den 56

当你传入inplace对原始变量进行更改并返回None,并且该函数返回修改后的数据帧时,它返回None.

is_none = df.set_index(['Company', 'date'], inplace=True)
df  # the dataframe you want
is_none # has the value None
Run Code Online (Sandbox Code Playgroud)

所以当你有一条像:

df = df.set_index(['Company', 'date'], inplace=True)
Run Code Online (Sandbox Code Playgroud)

它首先修改df...但它设置df为无!

也就是说,你应该只使用这一行:

df.set_index(['Company', 'date'], inplace=True)
Run Code Online (Sandbox Code Playgroud)