【问题标题】:Concat pandas dataframe combines out of orderConcat Pandas 数据框组合乱序
【发布时间】:2019-05-03 01:19:12
【问题描述】:

我正在尝试将文件列表合并到一个数据帧中,以便将其写回单个 csv。每次我使用 pd.concat 合并文件时,所有内容都会在合并的输出文件中完全重新排序(列和行)。我的代码是:

#create list of file paths
paths = []
for filepath in glob.iglob('pathtofiles'):
   paths.append(filepath)

#create list of dataframes to combine
df_list = []
for file in paths:
    df_list.append(pd.read_csv(file,header=0))

#combine all dataframes into single dataframe and output as csv
rebuild = pd.concat(df_list,  sort=True)
rebuild.to_csv('combined.csv',index=False)

单独的文件具有按 ['time'、'name'、'quantity'] 顺序排列的列,并按 ['time'] 列排序。当我合并文件时,我希望它们按 ['time'] 列的顺序合并,但我得到一个完全不同的顺序(即 ['quantity','time','name'] )并且文件是逐行乱序。

我认为这与当前单独文件的 ['time'] 列是字符串的事实有关,我相信它们需要是 datetime 对象才能正确组合,但我不确定如何正确处理这个问题,或者如果这确实是问题。

【问题讨论】:

  • 我在使用concat 之前遇到过这种情况,我通过之后使用df.reindex(columns=columns_list) 重新排序来保持列的顺序。虽然我无法准确解释发生了什么,但我将始终这样做,而不是依靠 pd.concat 来返回正确的顺序。安全总比后悔好!
  • 你能提供几行数据吗?
  • 读取 csv 时,将时间列设置为日期时间。 read_csv 中有 args 可以执行此操作。然后在你写csv的时候,留下索引。
  • @jeschward - 我添加了前几行的图片。我希望按第一列“时间”排序

标签: python pandas csv dataframe concat


【解决方案1】:

日期时间格式问题:

如果您查看 read_csv 的文档,您会发现它有参数“parse_dates”。为了告诉熊猫您的时间列是日期时间,您可以使用下面的pd.read_csv(file,header=0,parse_dates=['time']) 阅读 csv

列顺序问题:

正如 Rocky 已经提到的,您可以使用 df.reindex(columns=columns_list) 保持列顺序,其中 column_list 是您希望列的顺序。

按时间列问题排序:

如果您想按日期列显式排序,可以将您的to_csv 更改为首先像这样rebuild.sort_values('time').to_csv('combined.csv',index=False) 进行排序

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多