【问题标题】:Pandas Dataframe Append function does not persistPandas Dataframe Append 功能不持久
【发布时间】:2019-02-05 18:18:12
【问题描述】:

this Q&A 之后,我设法将多个 CSV 文件连接到一个时间序列数据帧中,并附加一列以添加每条记录来自的 CSV 文件的名称,如下所示:

import os
import glob
import pandas as pd

path = ''

all_files = glob.glob(os.path.join(path, "*.csv")) 

names = [os.path.basename(x) for x in glob.glob(path+'\*.csv')] 

df = pd.DataFrame()
for file_ in all_files:
    file_df = pd.read_csv(file_, sep=',', parse_dates=["capture_datetime_utc"], index_col="capture_datetime_utc")
    file_df['file_name'] = file_ 
    df = df.append(file_df)
df.shape

这似乎工作正常,并且 - 正如您在 this Jupyter Notebook 中看到的那样 -i 得到一个形状有 5 列的数据框。

但是当我将此时间序列 df 从 15 分钟间隔缩减为每小时平均值时,如下所示:

df_h = df.resample('H').mean()
df_h.shape

我得到一个形状只有 4 列的数据框。

所以看起来我执行的这个附加功能缺乏持久性,我需要让它持久化。我尝试将“inplace=True”arg 插入到 append 函数本身(引发错误)以及在它之后(没有区别)。

如果有人能告诉我如何使这个附加列永久化,我将非常感激!

【问题讨论】:

  • 您的 file_name 列正在被删除,因为它没有数字 dtype。见这里:stackoverflow.com/a/34270422/8146556
  • 感谢您的指点,@rahlf23;现在我知道为什么它不起作用了。但是我想知道如何将文件名(必要的字符串)转换为数字数据类型?
  • 您为什么对保留文件名感兴趣?您正在取数据的平均值,因此它无关紧要。
  • 我需要保留文件名,这样我就可以分辨出数据来自 300 个不同的土壤传感器中的哪一个。然后我从 1/4 小时到每小时间隔进行下采样,以便我可以将来自土壤传感器的数据与每小时记录的当地天气数据相关联。
  • 所以您需要按传感器分组然后重新采样?换句话说,您只想通过传感器单独取平均值?

标签: python pandas dataframe append time-series


【解决方案1】:

正在删除您的 file_name 列,因为它没有数字 dtype。更不用说,由于您正在通过mean() 有效地聚合数据框,因此您不应该对保留原始数据源的 file_name 感兴趣。在对连接的数据帧取平均值后,该信息将毫无意义。

我建议使用pd.concat() 代替df.append()。给定两个示例 csv 文件:

sample1.csv

capture_datetime_utc,fertilizer_level,light,soil_moisture_present,air_temperature_celsius
2018-07-30 17:34:33,-1.0,1.28,12.13,26.42
2018-07-30 17:49:33,-1.0,1.26,11.87,26.51
2018-07-30 18:04:33,-1.0,1.26,11.47,26.37
2018-07-30 18:19:33,-1.0,1.17,12.00,26.28
2018-07-30 18:34:33,-1.0,0.94,11.47,25.34

sample2.csv

capture_datetime_utc,fertilizer_level,light,soil_moisture_present,air_temperature_celsius
2018-08-28 07:50:23,-1.0,40.73,6.53,31.82
2018-08-28 08:05:23,-1.0,47.13,6.65,33.65
2018-08-28 08:20:23,-1.0,51.94,6.65,35.00
2018-08-28 08:35:23,-1.0,57.46,6.65,36.55
2018-08-28 08:50:23,-1.0,14.17,6.77,32.98

您可以执行以下操作:

all_files = ['sample1.csv','sample2.csv']

df = pd.concat([pd.read_csv(file_, sep=',', parse_dates=["capture_datetime_utc"], index_col="capture_datetime_utc") for file_ in all_files], keys=all_files)

df = df.reset_index().set_index('capture_datetime_utc').groupby('level_0').resample('H').mean().dropna()

这给出了:

                                  fertilizer_level      light  \
level_0     capture_datetime_utc                                
sample1.csv 2018-07-30 17:00:00               -1.0   1.270000   
            2018-07-30 18:00:00               -1.0   1.123333   
sample2.csv 2018-08-28 07:00:00               -1.0  40.730000   
            2018-08-28 08:00:00               -1.0  42.675000   

                                  soil_moisture_present  \
level_0     capture_datetime_utc                          
sample1.csv 2018-07-30 17:00:00               12.000000   
            2018-07-30 18:00:00               11.646667   
sample2.csv 2018-08-28 07:00:00                6.530000   
            2018-08-28 08:00:00                6.680000   

                                  air_temperature_celsius  
level_0     capture_datetime_utc                           
sample1.csv 2018-07-30 17:00:00                 26.465000  
            2018-07-30 18:00:00                 25.996667  
sample2.csv 2018-08-28 07:00:00                 31.820000  
            2018-08-28 08:00:00                 34.545000

【讨论】:

  • 干得好,@rahlf23;谢谢。我的投票还不算数,因为我在这里仍然是 n00b,但显然它仍然被记录下来。
  • 你打赌,如果你有能力,会很感激你的支持!
猜你喜欢
  • 2013-06-07
  • 1970-01-01
  • 1970-01-01
  • 2016-09-13
  • 1970-01-01
  • 2019-02-10
  • 2014-04-16
  • 2018-04-29
  • 1970-01-01
相关资源
最近更新 更多