【发布时间】:2020-07-27 06:38:03
【问题描述】:
我在重塑数据框数据时出错。
KeyError: 'Requested level (date) does not match index name (None)'
更多详情如下:
# dataframe
# print(df.head(3))
...
account_id entity ae is_pc is_new_customer agency related_entity type medium our_side_entity settlement_title settlement_short_title settlement_type system_value account_status date sale
12323 entity1 ae1 PC yes MB EC TWITTER our_side_entity1 settlement_title settlement_short_title 1 0.2 active 2020-07-01 jimmy
12323 entity1 ae1 PC yes MB EC GOOGLE our_side_entity2 settlement_title settlement_short_title 1 0.5 active 2020-07-02 jimmy
1037093 Bentity1 ae1 PC yes MB APP Google our_side_entity3 settlement_title settlement_short_title 2 0 disable 2020-07-03 jimmy
1037093 Bentity1 ae1 PC yes MB APP Google our_side_entity3 settlement_title settlement_short_title 2 2020-07-04 jimmy
1037093 Bentity1 ae1 PC yes MB APP Google our_side_entity3 settlement_title settlement_short_title 2 2020-07-05 jimmy
...
然后我想按account, date 分组并将帐户的总 system_value 相加。
我尝试使用以下代码但失败了:
indices = OrderedDict([
('account_id', 'ID'),
('entity', 'entity'),
('ae', 'AE'),
('is_pc', 'PC'),
('is_new_customer', 'new_customer'),
('agency', 'agency'),
('related_entity', 'related_entity'),
('type', 'type'),
('medium', 'medium'),
('our_side_entity', 'our_side_entity'),
('settlement_title', 'settlement_title'),
('settlement_short_title', 'settlement_short_title'),
('settlement_type', 'settlement_type'),
('account_status', 'account_status'),
('sale', 'sale'),
('date', 'date'),
])
df = df.groupby(list(indices.keys())).system_value.sum() \
.unstack('date', fill_value=None) \
.assign(total=lambda x: x.sum(1)) \
.reset_index()
print(df)
df = df.rename(columns=indices). \
set_index(indices['account_id'])
如下错误:
KeyError: 'Requested level (date) does not match index name (None)'
你能告诉我我的试验有什么问题吗?
谢谢。
更新我的试用的更多细节
以下代码可以一直重现错误
import pandas as pd
from collections import OrderedDict
s = [
{'account_id': '123123213',
'entity': 'entity2',
'ae': 'ae1',
'is_pc': 'PC',
'is_new_customer': 'yes',
'agency': 'BV',
'related_entity': None,
'type': 'EC',
'medium': 'Facebook',
'our_side_entity': 'our_side_entity',
'settlement_title': 'settlement_title',
'settlement_short_title': 'SS',
'settlement_type': 'unknown',
'system_value': None,
'account_status': None,
'date': '2020-07-22',
'sale': 'sale1'},
]
indices = OrderedDict([
('account_id', 'ID'),
('entity', 'Entity'),
('ae', 'AE'),
('is_pc', 'PC'),
('is_new_customer', 'NEW_CUSTOMER'),
('agency', 'agency'),
('related_entity', 'related_entity'),
('type', 'type'),
('medium', 'medium'),
('our_side_entity', 'our_side_entity'),
('settlement_title', 'settlement_title'),
('settlement_short_title', 'settlement_short_title'),
('settlement_type', 'settlement_type'),
('sale', 'sale'),
('date', 'date'),
])
df = pd.DataFrame.from_records(s)
# print df.to_dict()
{'account_id': {0: '123123213'}, 'entity': {0: 'entity2'}, 'ae': {0: 'ae1'}, 'is_pc': {0: 'PC'}, 'is_new_customer': {0: 'yes'}, 'agency': {0: 'BV'}, 'related_entity': {0: None}, 'type': {0: 'EC'}, 'medium': {0: 'Facebook'}, 'our_side_entity': {0: 'our_side_entity'}, 'settlement_title': {0: 'settlement_title'}, 'settlement_short_title': {0: 'SS'}, 'settlement_type': {0: 'unknown'}, 'system_value': {0: None}, 'account_status': {0: None}, 'date': {0: '2020-07-22'}, 'sale': {0: 'sale1'}}
df = df.groupby(list(indices.keys())).system_value.sum() \
.unstack('date', fill_value=None) \
.assign(total=lambda x: x.sum(1)) \
.reset_index()
indices["account_status"] = "status"
df = df.rename(columns=indices). \
set_index(indices['account_id'])
print(df)
【问题讨论】:
-
嘿,我已经复制了它,无法重现错误。可能是由于您的数据存在特定问题。你检查过所有的日期格式都没有问题吗?
-
@Let'stry 感谢您的回复,
system_value和account_status的某些值是空的。date值都是yyyy-mm-dd格式。我在我的问题中更新了更多细节 -
似乎对我也很好。您能否提供创建数据框相关部分的实际代码?我相信由于缺少值,我无法重现您的确切数据。
-
@Roy2012 感谢您的回答,我已经在上面更新了更多详细信息。谢谢
-
仍然无法复制。最好运行 df.to_dict() 并将结果粘贴到问题中。这样,我们就会知道我们正在查看相同的数据。