【问题标题】:Create empty csv file with pandas使用熊猫创建空的 csv 文件
【发布时间】:2016-06-25 06:58:56
【问题描述】:

我正在通过多个 csv 文件进行交互,并希望将平均温度附加到一个空白 csv 文件中。如何使用 pandas 创建一个空的 csv 文件?

for EachMonth in MonthsInAnalysis:
    TheCurrentMonth = pd.read_csv('MonthlyDataSplit/Day/Day%s.csv' % EachMonth)
    MeanDailyTemperaturesForCurrentMonth = TheCurrentMonth.groupby('Day')['AirTemperature'].mean().reset_index(name='MeanDailyAirTemperature')
    with open('my_csv.csv', 'a') as f:
        df.to_csv(f, header=False)

那么在上面的代码中,如何在for 循环之前创建my_csv.csv

请注意,我知道您可以创建一个数据框,然后将数据框保存到 csv,但我对您是否可以跳过此步骤感兴趣。

就上下文而言,我有以下 csv 文件:

每个都有以下结构:

每个文件的“日”列最多读取 30 天。

我想输出一个如下所示的 csv 文件:

但显然包括所有月份的所有日子。

我的问题是我不知道每个分析中包含哪些月份,因此我想使用一个 for 循环,该循环使用一个包含该信息的列表来访问相关的 csv,计算平均温度然后保存它全部整合到一个 csv 中。

输入为文本:

    Unnamed: 0  AirTemperature  AirHumidity SoilTemperature SoilMoisture    LightIntensity  WindSpeed   Year    Month   Day Hour    Minute  Second  TimeStamp   MonthCategorical    TimeOfDay
6   6   18  84  17  41  40  4   2016    1   1   6   1   1   10106   January Day
7   7   20  88  22  92  31  0   2016    1   1   7   1   1   10107   January Day
8   8   23  1   22  59  3   0   2016    1   1   8   1   1   10108   January Day
9   9   23  3   22  72  41  4   2016    1   1   9   1   1   10109   January Day
10  10  24  63  23  83  85  0   2016    1   1   10  1   1   10110   January Day
11  11  29  73  27  50  1   4   2016    1   1   11  1   1   10111   January Day

【问题讨论】:

  • 为什么要先创建?确定在保存时从头开始创建等同于附加到已经存在的空 csv 吗?
  • 因为在分组发生之前我不知道存在哪些 csv,所以我认为首先创建并填充存在的任何内容更容易。你会如何处理这个问题?
  • 所以你想覆盖 'my_csv.csv' 文件len(MonthsInAnalysis) 次 - 这就是你想要的吗? ;-)
  • 好吧,不要覆盖,for 循环将运行len(MonthsInAnalysis) 次,每次我得到一个新的 groupby 对象时,我都想将它附加到 csv 中。我认为这就是with open 部分所取得的成果。
  • @PaulBarr,我想如果您多解释一下,对您的帮助会更容易 - 您的源数据是什么以及您想要实现什么(即输出应该是什么样子)。可能还有另一种更优雅的解决方案,您不需要制作任何循环......

标签: python csv pandas is-empty


【解决方案1】:

只需以写入模式打开文件即可创建它。

with open('my_csv.csv', 'w'):
    pass

无论如何,我认为您不应该多次打开和关闭文件。文件最好打开一次,多写几遍。

with open('my_csv.csv', 'w') as f:
    for EachMonth in MonthsInAnalysis:
        TheCurrentMonth = pd.read_csv('MonthlyDataSplit/Day/Day%s.csv' % EachMonth)
        MeanDailyTemperaturesForCurrentMonth = TheCurrentMonth.groupby('Day')['AirTemperature'].mean().reset_index(name='MeanDailyAirTemperature')
        df.to_csv(f, header=False)

【讨论】:

  • 谢谢,这比我所做的更有意义。我会在几分钟内接受。
  • 这将覆盖 CSV 文件 len(MonthsInAnalysis)
  • @MaxU 不会的。
  • @Goyo,好的,运行以下测试:[pd.DataFrame(np.random.randn(4, 4)).to_csv('out.csv') for i in range(5)],最后告诉我们out.csv 中有多少行!按照您的逻辑,CSV 文件中必须有 5*4 = 20 行。请测试
  • @MaxU 这与我的建议无关。它更像是[pd.DataFrame(np.random.randn(4, 4)).to_csv(f) for i in range(5)],其中f 是可写文件对象,而不是文件名。
【解决方案2】:

我会这样做:首先将所有 CSV 文件(但只有您真正需要的列)读入一个 DF,然后制作 groupby(['Year','Month','Day']).mean() 并将生成的 DF 保存到 CSV 文件中:

import glob
import pandas as pd

fmask = 'MonthlyDataSplit/Day/Day*.csv'
df = pd.concat((pd.read_csv(f, sep=',', usecols=['Year','Month','Day','AirTemperature']) for f in glob.glob(fmask)))
df.groupby(['Year','Month','Day']).mean().to_csv('my_csv.csv')

如果想忽略年份:

import glob
import pandas as pd

fmask = 'MonthlyDataSplit/Day/Day*.csv'
df = pd.concat((pd.read_csv(f, sep=',', usecols=['Month','Day','AirTemperature']) for f in glob.glob(fmask)))
df.groupby(['Month','Day']).mean().to_csv('my_csv.csv')

一些细节:

(pd.read_csv(f, sep=',', usecols=['Month','Day','AirTemperature']) for f in glob.glob('*.csv'))

将从所有 CSV 文件中生成数据帧元组

pd.concat(...)

将它们连接成单个 DF

df.groupby(['Year','Month','Day']).mean()

将生成想要的报告作为数据框,可以保存到新的 CSV 文件中:

.to_csv('my_csv.csv')

【讨论】:

  • csv 位于子目录 MonthlyDataSplit/Day 中,在这个示例中我不太明白我将如何指导它。我会使用glob.glob('MonthlyDataSplit/Day/*.csv')吗?
  • 谢谢,我认为这种方法非常干净,也更灵活。感谢您的帮助
  • 我很乐意为您提供帮助。请下次在示例输入和所需输出(作为文本)后询问“熊猫”问题 - 它有助于更​​好地理解 OP 想要什么,也有助于开发解决方案。 :)
【解决方案3】:

创建一个空白的csv文件就像这个一样简单

import pandas as pd

pd.DataFrame({}).to_csv("filename.csv")

【讨论】:

    【解决方案4】:

    这个问题有点不清楚,但假设您必须逐月迭代,并按照说明应用 groupby,只需使用:

     #Before loops
     dflist=[]
    

    然后在每个循环中执行以下操作:

     dflist.append(MeanDailyTemperaturesForCurrentMonth)
    

    然后在最后:

     final_df = pd.concat([dflist], axis=1)
    

    这会将所有内容合并到一个数据框中。

    看看:

    http://pandas.pydata.org/pandas-docs/stable/generated/pandas.concat.html

    http://pandas.pydata.org/pandas-docs/stable/merging.html

    【讨论】:

    • IMO 在循环中执行 pd.concat() 并不是最好的主意 - 您可能希望将数据帧收集到列表中并将它们连接起来,当然如果它们不是很大的话。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-15
    • 1970-01-01
    • 1970-01-01
    • 2023-02-01
    • 2013-07-30
    • 2021-02-03
    • 2018-05-28
    相关资源
    最近更新 更多