【问题标题】:For loop export to CSV with dynamic CSV naming使用动态 CSV 命名将循环导出到 CSV
【发布时间】:2019-07-17 00:30:42
【问题描述】:

我对 Python 比较陌生(我的大部分经验都是在 SAS 方面),所以请多多包涵。

我正在尝试从现有数据集创建多个 CSV,并根据定义的列表导出它们。 CSV 的命名应根据相应的列表值动态命名。

我已经尝试了很多东西 - 主要是在黑暗中刺伤 - 没有任何效果。见下面的代码

cc = ['AD-1','AD-2','AD-3'] #the list I want it to cycle through
for index in range(len(cc)): 
    df1_cc = df[df['charge'].isin(cc)] #df is predefined 
    #set "charge" as the index variable so you can aggregate on it           
    df1_cc = df1_cc.set_index('charge')
    df1_cc
    #sum up values based on individual values of 'charge'
    table1_cc = df1_cc.sum(level='charge')
    table1_cc
    #output to CSV
    table1_cc.to_csv(r"C:\Users\etc\table1_"+cc+".csv")

注意,cc(AD-1、AD-2 和 AD-3)中的值包含在 'charge' 等中

我得到的唯一错误是:

table1_cc.to_csv(r"C:\Users\etc\"+cc+".csv")

我得到的错误是: TypeError:只能将str(不是“list”)连接到str

输出应该是 3 个文件:table1_AD-1.csv、table1_AD-2.csv 和 table1_AD-3.csv,每个文件都应该包含每个单独的总和值(同样,该部分有效。真正的问题是循环并将 cc 中每个单独值的输出导出到 CSV)。

感谢任何帮助!

【问题讨论】:

  • 欢迎使用 Python!重新处理循环的“惯用”方法是直接在列表中使用“in”运算符 - cc.例如:for name_stub in cc: 然后在需要的地方使用name_stub。这将是完整的“pythonista”风格......但也可以尝试按照下面的建议进行枚举,以便在循环内为您提供“`”风格的递增计数器!

标签: python pandas for-loop export-to-csv


【解决方案1】:

to_csv的最后一行需要改一下

cc = ['AD-1','AD-2','AD-3'] #the list I want it to cycle through
for index in range(len(cc)): 
    df1_cc = df[df['charge'].isin([cc[index]])] #df is predefined 
    #set "charge" as the index variable so you can aggregate on it           
    df1_cc = df1_cc.set_index('charge')
    df1_cc
    #sum up values based on individual values of 'charge'
    table1_cc = df1_cc.sum(level='charge')
    table1_cc
    #output to CSV
    table1_cc.to_csv(r"C:\Users\etc\table1_"+cc[index]+".csv")

【讨论】:

  • 这行得通 - 大部分!当我检查输出时,我得到三个正确命名的 CSV 文件。问题是,每个都包含以下内容:charge hrs AD-1 2638 AD-2 2581 AD-3 246 而第一个应该是:charge hrs AD-1 2638 第二个应该是:charge hrs AD-2 2581 最后一个应该是是:收费小时 AD-3 246
  • 感谢更新。我收到此错误:TypeError: only list-like objects are allowed to be pass to isin(), you pass a [str]
  • @ZDR 在该行添加 [] ,再次检查
【解决方案2】:

您还可以像这样遍历您的 cc 列表:

cc_list = ['AD-1','AD-2','AD-3'] #the list I want it to cycle through

for index,cc in enumerate(cc_list): 
    df1_cc = df[df['charge'].isin([cc])] #df is predefined 
    #set "charge" as the index variable so you can aggregate on it           
    df1_cc = df1_cc.set_index('charge')
    df1_cc
    #sum up values based on individual values of 'charge'
    table1_cc = df1_cc.sum(level='charge')
    table1_cc
    #output to CSV
    table1_cc.to_csv(r"C:\Users\etc\table1_{}.csv".format(cc))

【讨论】:

  • 谢谢纳科尔。与我对上面的最初评论类似,它有效,但输出不太正确:这有效 - 大部分!当我检查输出时,我得到三个正确命名的 CSV 文件。问题是,每个都包含以下内容:charge hrs AD-1 2638 AD-2 2581 AD-3 246 而第一个应该是:charge hrs AD-1 2638 第二个应该是:charge hrs AD-2 2581 最后一个应该是是:收费小时 AD-3 246
猜你喜欢
  • 1970-01-01
  • 2018-03-13
  • 1970-01-01
  • 2018-10-28
  • 1970-01-01
  • 2014-12-05
  • 1970-01-01
  • 1970-01-01
  • 2016-03-13
相关资源
最近更新 更多