【问题标题】:KeyError: 'Requested level (date) does not match index name (None)'KeyError:'请求的级别(日期)与索引名称不匹配(无)'
【发布时间】: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_valueaccount_status 的某些值是空的。 date 值都是yyyy-mm-dd 格式。我在我的问题中更新了更多细节
  • 似乎对我也很好。您能否提供创建数据框相关部分的实际代码?我相信由于缺少值,我无法重现您的确切数据。
  • @Roy2012 感谢您的回答,我已经在上面更新了更多详细信息。谢谢
  • 仍然无法复制。最好运行 df.to_dict() 并将结果粘贴到问题中。这样,我们就会知道我们正在查看相同的数据。

标签: python pandas


【解决方案1】:

您正在按所有无值的列进行分组。在您的示例中,related_entity 的值为 None,这会导致数据框为空:

In [7]: df.groupby(list(indices.keys())).sum()                                                                                                                                                                       
Out[7]: 
Empty DataFrame
Columns: []
Index: []

我建议您从 groupby 子句中删除此列

[编辑]:将related_entity的值设置为entity的值,你可以简单地这样做:

df['related_entity'] = df['entity']

或者假设你有一些你不想替换的值:

df['related_entity'] = df['related_entity'].fillna(df['entity'])

【讨论】:

  • 谢谢,我不擅长pandas。我如何将related_entity 的值设置为entity,如果它是None。欣赏它
猜你喜欢
  • 2020-11-01
  • 1970-01-01
  • 2022-10-06
  • 1970-01-01
  • 1970-01-01
  • 2016-01-14
  • 1970-01-01
  • 2021-11-13
  • 2016-02-21
相关资源
最近更新 更多