【问题标题】:Pandas Dataframe to CSV only gets the first rowPandas Dataframe to CSV 仅获取第一行
【发布时间】:2021-08-17 13:51:59
【问题描述】:

我在 pandas DF 中有以下一组行:

idx col1 col2 col3 col4
0 A B C D
1 E F G H
1 I J K L
2 M M O P
2 Q R S T

我想将每组索引行转换为 CSV 并打印到文件。

所以我最终得到一个文件,其中一行 idx 0,两行 idx 1,两行 idx 2。

像这样:

文件1
col1,col2,col3,col4
A,B,C,D

文件2
col1,col2,col3,col4
E,F,G,H
I,J,K,L

文件3
col1,col2,col3,col4
M,N,O,P
Q,R,S,T

我有这段代码,但它只给了我每个索引集的第一行:

for i, dfr in Template.TEMPLATE_DF.iterrows(): 
        fpath = path + '\\' + dfr['tmpl.title'].lower().replace(' ', '_') + '_' + str(dfr['tmpl.id']) + '.csv'
        dfr=pd.DataFrame(data=dfr).transpose()
        dfr.to_csv(fpath, sep=',', encoding='utf-8', na_rep='NULL', index=False)

我在这里错过了什么?

【问题讨论】:

  • 这可能会有所帮助Split pandas dataframe based on groupby
  • dfs = [x for _, x in df.groupby('idx')]dfs 中写出每个df
  • 添加代码以初始化数据框 - 使其成为一个完全运行的程序。然后我们可以复制/更改/粘贴一个可行的解决方案。
  • @Henry Ecker:感谢您的回复。但我仍然只得到一排。我肯定有多行应该在那里。这就是我所做的:dfs = [x for _, x in dfr.groupby('idx')] for df in dfs: df.to_csv(...)
  • 不,您应该对源 DF 进行分组。 dfs = [x for _, x in Template.TEMPLATE_DF.groupby('idx')]

标签: python pandas


【解决方案1】:

这会将每个分组发送到函数,它应该被写入文件。检查 fpath 虽然这会发生变化,因为您不再通过 iterrows 发送一行,而是数据帧的一部分,所以我使用 [0] 来获取 x 的第一行,但就像我说的那样,不确定它是否有效,因为它不是测试。

data='''idx tmpl.id tmpl.title  col3    col4
0   10  title one   C   D
1   20  title two   G   H
1   30  title three K   L
2   40  title four  O   P
2   50  title five  S   T'''

df = pd.read_csv(io.StringIO(data), sep=' \s+', engine='python')
def write_csv(x):
    # print(x['tmpl.title'].iat[0])
    fpath = path + '\\' + x['tmpl.title'].iat[0].lower().replace(' ', '_') + '_' + str(x['tmpl.id'].iat[0]) + '.csv' # this probably isn't correct
    x.transpose()
    x.to_csv(fpath, sep=',', encoding='utf-8', na_rep='NULL', index=False)

# df.groupby(df.index).apply(write_csv)
df.groupby('idx').apply(write_csv)

如果 idx 不是您的索引,则使用

df.groupby('idx').apply(write_csv)

【讨论】:

  • 感谢您的回复!这行得通!但是,PATH 部分不起作用。代码原样适用于前两组,但在第三组中失败并出现索引错误。我添加了一个 try/except 并将索引设置为 1,然后它给出了 Series 错误。尝试了不同的组合,不行。我需要工作的道路。我尝试像这样获取每个组的第一行:grp.nth(0) 然后我认为 Id 得到了正确的属性,但也没有用。
  • 添加您的确切列,因为如果您的示例与您的实际数据不匹配,我无能为力。
  • 如果您指的是列名,那么它们就是:'tmpl.builtin_name', 'tmpl.id', 'tmpl.title', 'flds.id', 'flds.field_type', 'flds.tooltip_text', 'flds.name_plural', 'flds.name_singular', 'flds.backref_name', 'flds.backref_tooltip_text', 'flds.allow_multiple', 'flds.allowed_otypes', 'flds.options','flds.builtin_name'。按Template.TEMPLATE_DF.index分组
  • 操作方法如下: id = str(x['tmpl.id'].unique()[0:1][0]) ttl = str(x['tmpl.title' ].unique()[0:1][0]) fpath = path + '\\' + ttl.lower().replace(' ', '') + '' + id + '.csv'
  • 用您的专栏标题更新了我的代码。我省略了 .iat
猜你喜欢
  • 2021-04-21
  • 1970-01-01
  • 1970-01-01
  • 2021-02-17
  • 1970-01-01
  • 2021-05-05
  • 2018-10-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多