Сохранение каждого нового фрейма данных, созданного внутри цикла for в Python - PullRequest
0 голосов
/ 12 сентября 2018

Я написал функцию, которая перебирает файлы в папке и выбирает определенные данные. Файлы .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 голосов
/ 12 сентября 2018

Если ваш фрейм данных имеет структуру, которая удовлетворяет требованиям для фрейма данных pandas:

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 ()?Насколько я вижу, требуется только одна переменная - srcPath, вызываемая в .glob (), и эта переменная не передается в функцию, поэтому она должна быть глобальной переменной.

РЕДАКТИРОВАТЬ: Я обновил код выше на основе изменений к первоначальным вопросам, и комментарии к этому посту ниже.

РЕДАКТИРОВАТЬ 2: Оказывается, что вашвызов glob.glob () не выдал то, что вы хотели.Смотрите обновленный код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...