熊猫数据框追加功能不持久

时间:2018-08-30 18:19:32

标签: python pandas dataframe append time-series

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

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

所以看来我执行的这个追加函数缺少持久性,我需要使其保持持久性。我尝试将“ inplace = True” arg插入附加函数本身(引发错误),并且在插入函数之后(没有区别)。

如果有人可以向我展示使该附加专栏永久化的方法,我将非常有义务!

1 个答案:

答案 0 :(得分:0)

您的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