【问题标题】:sorting rows when exporting pandas csv file导出 pandas csv 文件时对行进行排序
【发布时间】:2018-11-26 12:49:57
【问题描述】:

我有一个包含 700k 行的 CSV 文件,我需要做的是创建一个额外的 CSV,它已经获取了我需要的数据并将其排序。

例如,我的原始 csv 文件中的数据看起来有点像这样。

Name     Code   Date        Area
Peter     01    01/01/2016  Wales
Peter     02    01/02/2017  England
Peter     34    25/02/2018  Wales
Paul      65    01/12/2015  Scotland
Paul      12    02/12/2015  Scotland
Simon     12    23/08/2016  England
Simon     12    28/09/2016  Wales
Simon     12    27/10/2018  England

我需要做的是为一个人创建一个唯一的行,但根据代码的制作时间列出代码(最旧的日期在前)。我应该指出,我在 Excel 中对数据集进行了排序,以便以正确的顺序(最旧的在前)列出日期,看看是否有帮助。

所以我需要的输出应该是这样的:

Name   Codes   
Peter  01,02,34
Paul   65,12
Simon  12,12,12

代码按最早日期排列。

我对该区域不感兴趣,因为它与最终答案无关。

我已成功将名称和代码放入相关列,但由于某种原因,代码未按最早日期列出。

我已尝试搜索此内容,但似乎无法正确措辞以获得相关结果。

有人知道为什么序列不能正确导出吗?

我使用的代码是:

df2 = df2.groupby ('Name')['Code'].apply(', '.join).reset_index()
df2
export_csv = df2.to_csv(r'Filelocation.csv', index = None, header = True)

谢谢

【问题讨论】:

    标签: python pandas pandas-groupby


    【解决方案1】:

    我猜以下可能会起作用:

    df2.groupby('Name')['Code'].apply(lambda x: " " % ', '.join(x))
    

    【讨论】:

      【解决方案2】:

      由于我不知道 df2 为您提供什么,所以我创建了一个数据框并验证了您的代码,它为我提供了正确的序列。实施并让我知道什么对你不起作用:

      df = pd.DataFrame({'Name': ['Peter', 'Peter', 'Peter', 'Paul', 'Paul', 'Simon', 'Simon', 'Simon'],
                         'Code': ['01', '02', '34', '65', '12', '12', '12', '12']})
      df
      
          Code    Name
      0   01  Peter
      1   02  Peter
      2   34  Peter
      3   65  Paul
      4   12  Paul
      5   12  Simon
      6   12  Simon
      7   12  Simon
      
      dfn = df.groupby ('Name')['Code'].apply(', '.join).reset_index()
      dfn
      
          Name    Code
      0   Paul    65, 12
      1   Peter   01, 02, 34
      2   Simon   12, 12, 12
      
      dfn.index = dfn.Name # Mapping index with column Name
      dfn.drop(columns=['Name'], inplace=True) # Dropping column Name
      dfn
      
              Code
      Name    
      Paul    65, 12
      Peter   01, 02, 34
      Simon   12, 12, 12
      
      dfn = dfn.loc[df.Name.unique()] # Bringing dataframe into your desired order
      dfn
      
              Code
      Name    
      Peter   01, 02, 34
      Paul    65, 12
      Simon   12, 12, 12
      
      
      dfn.to_csv('sample.csv')
      

      这是你需要的吗?如果没有,请发表评论。

      【讨论】:

      • 您好,感谢您的回复。 'ValueError' 上升不能用包含 NA/NaN 值的向量进行索引。
      • 您能否通过修改您的问题来澄清您的原始数据框。在您的问题中,我无能为力。
      • 当然 - 我有一个 csv 文件,其中包含 700k 行,其中有很多列,但我感兴趣的只有 3 个,它们是“名称”、“代码”和“日期”。我基于这些创建了一个数据框并将其命名为 df2。我需要做的就是按“名称”创建唯一的行,然后根据它们的制作日期列出代码,如您提供的输出中所示。我最初按日期对 CSV 文件进行排序,以查看这是否有助于排序,但没有。也许如果我通过 Python 按日期排序会有所帮助?谢谢
      • @MartinPugsley 您能否修改有问题的数据框以及日期列,然后展示最终的预期输出。如果你能做到,那就很容易回答了。
      • 我已经编辑了我的原始帖子,看看是否有帮助。谢谢
      【解决方案3】:

      问题可能是您在将系列转换为datetime 时没有指定dayfirst=True

      df['Date'] = pd.to_datetime(df['Date'], dayfirst=True)
      

      然后您可以按Date 排序并照常执行groupby 操作:

      res = df.sort_values('Date')\
              .groupby('Name')['Code']\
              .agg(lambda x: ','.join(map(str, x)))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-06-23
        • 1970-01-01
        • 1970-01-01
        • 2015-12-24
        • 2018-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多