【问题标题】:ValueError: cannot reindex from a duplicate axis pd.concatValueError:无法从重复的轴 pd.concat 重新索引
【发布时间】:2018-07-18 21:16:38
【问题描述】:

我正在尝试连接熊猫数据框:

def extract_articles(data, article_numbers):
  result = pd.concat(
     [
        data[data['ARTICLENO'] == article_no]['QUANTITY']
        for article_no in article_numbers
     ],
     axis=1,
  ).fillna(0)
  result.columns = article_numbers
  return result

从 csv 读取更多行(大约 100k)时,我收到以下错误: ValueError:无法从重复的轴重新索引

这是我的 csv 的基本外观:

Date,       ArticleNo, Quantity
2018-07-15, 1005,      150
2018-07-14, 1005,      165
2018-07-12, 1005,      160
2018-07-14, 1008,      230
2018-07-12, 1008,      245

文件按文章编号和日期排序。对于每个日期,可能有多个“文章编号-数量-元组”。有些文章编号可能没有数据,它们为 0。 为什么会出现这个错误?

【问题讨论】:

    标签: pandas scikit-learn


    【解决方案1】:

    我认为有重复的索引值,你可以改变:

    data[data['ARTICLENO'] == article_no]['QUANTITY']
    

    (data.loc[data['ARTICLENO'] == article_no, ['QUANTITY']]
          .set_index(data.groupby('Date').cumcount(), append=True))
    

    MultiIndex

    但是对于您的预期输出,需要聚合 sum 并通过 unstack 重塑:

    df = df.groupby(['Date','ArticleNo'])['Quantity'].sum().unstack(fill_value=0)
    print (df)
    ArticleNo   1005  1008
    Date                  
    2018-07-12   160   245
    2018-07-14   165   230
    2018-07-15   150     0
    

    【讨论】:

    • 但我需要日期作为进一步处理的索引
    • @ItFreak - 答案已编辑,问题重复Dates 每ArticleNo
    • 这给了我一个没有 set_index 方法的系列
    • 谢谢,这行得通,但我更喜欢列中的文章编号和从上到下的数量,日期作为索引以及文章编号没有价值的每个日期的数据框 i更喜欢零。
    • 嘿,非常感谢,成功了!我遇到的唯一问题:如果文章编号在 2016 年 1 月 1 日获得第一个条目,并且数据框在 2015 年 1 月 1 日“开始”:如何删除 0 到 2015 年全年的文章编号?你明白我的意思吗? (背景:我需要用 kmeans 对帧进行聚类,因此我总是需要一年的数据,所以我只想使用例如 2015 年的值)
    猜你喜欢
    • 2015-02-26
    • 2016-05-17
    • 2020-05-23
    • 2018-02-02
    • 1970-01-01
    • 1970-01-01
    • 2023-01-30
    • 2021-10-03
    • 1970-01-01
    相关资源
    最近更新 更多