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

2024-10-05 13:21:31 发布

您现在位置:Python中文网/ 问答频道 /正文

  • 我尝试实现这一点的原因是使用大量变量名来创建大量包含原始变量名的新变量名
  • 例如,我在每个位置都有几个熊猫库存项目的数据框。
    • 我想创建新的数据框,其中只包含负库存项,并在原始变量名(库存位置)后面附加'_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'

Tags: readstock库存siteallxlswarehouseexcel
2条回答

我的建议是不要使用变量名作为数据的“键”,而是在元组或dict中为它们指定专有名称

因此,不是:

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]
  • 使用^{}模块中的^{}创建现有文件的列表
  • 使用^{}更新文件名
  • 遍历每个文件:
    1. 创建一个数据帧
    2. 过滤数据帧。如果列不存在(例如AttributeError: 'DataFrame' object has no attribute 'OnHand'),则会发生错误,因此我们将代码放在^{}块中。^{}语句继续循环的下一次迭代
    3. 检查数据帧是否不是empty。如果不是空的话
    4. 如果需要,将数据帧添加到字典以进行额外处理
    5. 将数据帧另存为新文件,并在文件名中添加_neg
from pathlib import Path
import pandas as pd

# set path to top file directory
d = Path(r'e:\PythonProjects\stack_overflow\stock_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']

相关问题 更多 >

    热门问题