Установить мультииндекс существующего фрейма данных в 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
Я хочу передать компанию и дату для установки 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
Но когда я печатаю этот DataFrame
, он печатает None
. Я видел это решение из stackoverflow it self. Это не правильный способ сделать это. Также я хочу перетасовать позиции компании и даты столбцов, чтобы компания стала первым индексом, а дата стала второй в иерархии. Любые идеи по этому поводу?
Ответы
Ответ 1
Когда вы проходите внутри места вносит изменения в исходную переменную и возвращает None, а функция не возвращает измененный фреймворк данных, он возвращает None.
is_none = df.set_index(['Company', 'date'], inplace=True)
df # the dataframe you want
is_none # has the value None
поэтому, когда у вас есть строка вроде:
df = df.set_index(['Company', 'date'], inplace=True)
он сначала изменяет df
..., но затем устанавливает df
на None!
То есть, вы должны просто использовать строку:
df.set_index(['Company', 'date'], inplace=True)