如何过滤多个数据帧并将字符串附加到保存文件名?


  • 我试图实现这一点的原因是使用大量变量名称来创建许多包含原始变量名称的新变量名称。
  • 例如,我在每个位置都有库存项目的熊猫数据框。
    • 我想创建新的数据框,仅包含负库存项目,并将'_neg'附加到原始变量名称(库存位置(。
    • 我希望能够使用如下所示的 for 循环来做到这一点:
warehouse = pd.read_excel('warehouse.xls')
retail = pd.read_excel('retailonhand.xls')
shed3 = pd.read_excel('shed3onhand.xls')
tank1 = pd.read_excel('tank1onhand.xls')
tank2 = pd.read_excel('tank2onhand.xls')
all_stock_sites = [warehouse,retail,shed3,tank1,tank2]
all_neg_stock_sites = []
for site in all_stock_sites:
string_value_of_new_site = (pseudo code):'site-->string_value_of_site' + '_neg'
string_value_of_new_site = site[site.OnHand < 0]
all_neg_stock_sites.append(string_value_of_new_site)
  • 创建这样的东西
# create new dataframes for each stock site's negative 'OnHand' values
warehouse_neg = warehouse[warehouse.OnHand < 0]
retail_neg = retail[retail.OnHand < 0]
shed3_neg = shed3[shed3.OnHand < 0]
tank1_neg = tank1[tank1.OnHand < 0]
tank2_neg = tank2[tank2.OnHand < 0]
  • 无需键入所有 500 个不同的库存站点位置并手动附加'_neg'

我的建议是不要使用变量名称作为数据的"键",而是在元组或字典中为它们分配专有名称。

所以代替:

warehouse = pd.read_excel('warehouse.xls')
retail = pd.read_excel('retailonhand.xls')
shed3 = pd.read_excel('shed3onhand.xls')

您将拥有:

sites = {}
sites['warehouse'] = pd.read_excel('warehouse.xls')
sites['retail'] = pd.read_excel('retailonhand.xls')
sites['shed3'] = pd.read_excel('shed3onhand.xls')
...etc

然后,您可以像这样创建负键:

sites_neg = {}
for site_name, site in sites.items():
neg_key = site_name + '_neg'
sites_neg[neg_key] = site[site.OnHand < 0]
  • 使用pathlib模块中的rglob创建现有文件的列表
    • Python 3 的 pathlib 模块:驯服文件系统
    • .parent
    • .stem
    • .suffix
  • 使用f-strings更新文件名
    • PEP 498 - 文字字符串插值
  • 循环访问每个文件:
    1. 创建数据帧
    2. 筛选数据帧。 如果列不存在,则会发生错误(例如AttributeError: 'DataFrame' object has no attribute 'OnHand'(,所以我们把代码放在一个try-except块中。continue语句继续循环的下一次迭代。
    3. 检查数据帧是否不为空。 如果它不是空的,那么...
    4. 如果需要,将数据帧添加到字典以进行其他处理。
    5. 将数据框另存为新文件,并将_neg添加到文件名中
from pathlib import Path
import pandas as pd
# set path to top file directory
d = Path(r'e:PythonProjectsstack_overflowstock_sites')
# get all xls files
files = list(d.rglob('*.xls'))
# create, filter and save dict of dataframe
df_dict = dict()
for file in files:
# create dataframe
df = pd.read_excel(file)
try:
# filter df and add to dict
df = df[df.OnHand < 0]
except AttributeError as e:
print(f'{file} caused:n{e}n')
continue 
if not df.empty:
df_dict[f'{file.stem}_neg'] = df
# save to new file
new_path = file.parent / f'{file.stem}_neg{file.suffix}'
df.to_excel(new_path, index=False)
print(df_dict.keys())
>>> dict_keys(['retailonhand_neg', 'shed3onhand_neg', 'tank1onhand_neg', 'tank2onhand_neg', 'warehouse_neg'])
# access individual dataframes as you would any dict
df_dict['retailonhand_neg']

相关内容

最新更新