在 Python 中保存在 for 循环内创建的每个新数据帧
Saving each new dataframe created inside a for-loop in Python
我编写了一个函数来遍历文件夹中的文件并选择某些数据。 .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'
如果您的数据框的结构满足 pandas DataFrame 的要求:
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,这不是传递给函数的变量,所以它必须是一个全局变量。
编辑: 我已经根据对原始问题的修改更新了上面的代码,以及下面对此 post 的评论。
编辑 2: 事实证明,您对 glob.glob() 的调用没有产生您想要的结果。请参阅更新的代码。
我编写了一个函数来遍历文件夹中的文件并选择某些数据。 .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'
如果您的数据框的结构满足 pandas DataFrame 的要求:
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,这不是传递给函数的变量,所以它必须是一个全局变量。
编辑: 我已经根据对原始问题的修改更新了上面的代码,以及下面对此 post 的评论。
编辑 2: 事实证明,您对 glob.glob() 的调用没有产生您想要的结果。请参阅更新的代码。