保存在Python中的for循环内创建的每个新数据框

时间:2018-09-12 06:56:13

标签: python for-loop dataframe override mask

我编写了一个函数,该函数可遍历文件夹中的文件并选择某些数据。 .csv文件如下所示:

Timestamp  Value         Result    
00-00-10   34567          1.0  
00-00-20   45425     
00-00-30   46773          0.0  
00-00-40   64567   
00-00-50   25665          1.0  
00-01-00   25678  
00-01-10   84358 
00-01-20   76869          0.0
00-01-30   95830          
00-01-40   87890        
00-01-50   99537            
00-02-00   85957          1.0
00-02-10   58840    

它们保存在路径C:/Users/me/Desktop/myfolder/data中,我在C:/Users/me/Desktop/myfolder中编写了代码。函数(在@Daniel R的建议之后):

PATH = os.getcwd()+'\DATA\\'
def my_function(SourceFolder):
for i, file_path in enumerate(os.listdir(PATH)):
    df = pd.read_csv(PATH+file_path)
    mask = (
    (df.Result == 1) 
    | (df.Result.ffill() == 1)
    | ((df.Result.ffill() == 0) 
       & (df.groupby((df.Result.ffill() != df.Result.ffill().shift()).cumsum()).Result.transform('size') <= 100))
   )
    df = mask[df]  
    df = df.to_csv(PATH+'df_{}.csv'.format(i))

我最初的问题是:如何在不覆盖数据的情况下将每个df[mask]保存到NewFolder?上面的代码抛出AttributeError: 'str' object has no attribute 'Result'.

AttributeError                            Traceback (most recent call last)
<ipython-input-3-14c0dbaf5ace> in <module>()
----> 1 retrieve_data('C:/Users/me/Desktop/myfolder/DATA/*.csv')

<ipython-input-2-ba68702431ca> in my_function(SourceFolder)
      6         (df.Result == 1)
      7         | (df.Result.ffill() == 1)
----> 8         | ((df.Result.ffill() == 0) 
      9            & (df.groupby((df.Result.ffill() != df.Result.ffill().shift()).cumsum()).Result.transform('size') <= 100)))
     10         df = df[mask]

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\generic.py in __getattr__(self, name)
   4370             if self._info_axis._can_hold_identifiers_and_holds_name(name):
   4371                 return self[name]
-> 4372             return object.__getattribute__(self, name)
   4373 
   4374     def __setattr__(self, name, value):

AttributeError: 'DataFrame' object has no attribute 'Result'

1 个答案:

答案 0 :(得分:0)

如果您的数据框的结构满足熊猫数据框的要求:

import pandas as pd
import os

# Let '\DATA\\' be the directory where you keep your csv files, as a subdirectory of .getcwd()
PATH = os.getcwd()+'\DATA\\'
def my_function(source_folder):
    for i, file_path in enumerate(os.listdir(PATH)):
        df = pd.read_csv(PATH+file_path)   # Use read_csv here, not DataFrame.
                              # You are still working with a filepath, not a dictionary.
        mask = ( (df.Result == 1) | (df.Result.ffill() == 1) |
                 ((df.Result.ffill() == 0) &
                 (df.groupby((df.Result.ffill() !=
                  df.Result.ffill().shift()).cumsum()).Result.transform('size') <= 100))
                 )
        df = df[mask]
        df = df.to_csv(PATH+'df_{}.csv'.format(i))

作为一般规则,在提出类似问题时,应提供正在处理的数据的样本。否则,收到的答案可能对您不起作用。请使用dataframe / csv文件的示例以及目录的模拟内容来更新问题,以便我可以更新此答案。

如果srcPath与os.getcwd()不同,则可能需要在迭代文件之前计算完整路径或相对于.getcwd()的路径。

此外,上面的list()调用可能不是必需的,无论有没有代码,都要对其进行测试。

最后,为什么需要两个变量作为my_function()的输入? 据我所知,只需要一个变量,即.glob()中调用的srcPath,这不是传递给函数的变量,因此它必须是全局变量。

编辑:我是根据对原始问题的修改以及下面对此帖子的评论更新了上面的代码。

编辑2:结果表明,您对glob.glob()的调用没有产生您想要的。请参阅更新的代码。