【问题标题】:Pandas split data frame into multiple csv's based on column valuePandas 根据列值将数据框拆分为多个 csv
【发布时间】:2018-03-01 21:34:16
【问题描述】:

我有一个非常 similar to this one 的问题,但我需要更进一步,将拆分的数据帧保存到 csv。

import pandas as pd
import numpy as np
import os

df = pd.DataFrame({ 'CITY' : np.random.choice(['PHOENIX','ATLANTA','CHICAGO', 'MIAMI', 'DENVER'], 1000),
                    'DAY': np.random.choice(['Monday','Tuesday','Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'], 1000),
                    'TIME_BIN': np.random.randint(1, 86400, size=1000),
                    'COUNT': np.random.randint(1, 700, size=1000)})

df['TIME_BIN'] = pd.to_datetime(df['TIME_BIN'], unit='s').dt.round('10min').dt.strftime('%H:%M:%S')
print(df)

OUTPUT:
         CITY  COUNT        DAY  TIME_BIN
0     ATLANTA    476   Thursday  12:20:00
1     PHOENIX     50   Saturday  15:40:00
2       MIAMI    250     Friday  08:20:00
3     CHICAGO    358     Monday  15:40:00
4     PHOENIX    217   Thursday  22:10:00
5       MIAMI     12   Thursday  21:40:00
6      DENVER     22     Friday  10:30:00
7     CHICAGO    645     Sunday  23:40:00
8       MIAMI    188     Sunday  08:40:00

我想为每个城市制作一个单独的数据框并将其保存为 .csv。下面的代码有效,但我如何以 Pythonic 方式执行它而无需明确说明每个城市?真实数据集有大约 20 个城市,所以我不想重复这 20 次。我认为下面的代码可以使用 for 循环在 1-2 行中完成,但我不知道它会是什么样子。类似于“df['CITY'] 中的城市”

df_phoenix = df[df['CITY'] == "PHOENIX"]
df_atlanta = df[df['CITY'] == "ATLANTA"]
df_chicago = df[df['CITY'] == "CHICAGO"]
df_phoenix.to_csv(os.getcwd() + "/data_phoenix.csv")
df_atlanta.to_csv(os.getcwd() + "/data_atlanta.csv")
df_chicago.to_csv(os.getcwd() + "/data_chicago.csv")

【问题讨论】:

    标签: python pandas csv


    【解决方案1】:

    我认为您需要 groupby 带有自定义 lambda 函数或带有循环:

    f = lambda x: x.to_csv(os.getcwd() + "/data_{}.csv".format(x.name.lower()), index=False)
    df.groupby('CITY').apply(f)
    

    for i, x in df.groupby('CITY'):
         x.to_csv(os.getcwd() + "/data_{}.csv".format(i.lower()), index=False)
    

    通过评论编辑,感谢@Anton vBR:

    for i, x in df.groupby('CITY'):
        p = os.path.join(os.getcwd(), "data_{}.csv".format(i.lower()))
        x.to_csv(p, index=False)
    

    【讨论】:

    • 谢谢,它有效,是我一直在寻找的漂亮的单线。在研究 Pandas 问题时,我经常在答案部分看到你的名字 :)
    • 很好,不知道没有循环也可以。 os.getcwd() + 有必要吗?当然,如果我们不指定,我们只是默认写入当前工作目录。
    • @Calculus One-liners 可能很漂亮,但有时它们也不太可读。
    • @AntonvBR - 我添加了解决方案,你觉得这样吗?
    • 漂亮的解决方案。注意os.path.join(os.getcwd(), ) 是多余的,可以删除。
    猜你喜欢
    • 2021-04-29
    • 2021-02-24
    • 2016-06-24
    • 1970-01-01
    • 1970-01-01
    • 2021-03-31
    • 2015-01-15
    • 2018-05-05
    • 1970-01-01
    相关资源
    最近更新 更多