首页 > 解决方案 > 如何将变量的动态列表添加到命令 pd.concat

问题描述

我正在使用 python3 和 pandas 创建一个脚本,它将:

问题是我无法制定一种方法来创建正在使用的变量列表并将它们作为 arg 应用到命令 pd.concat 中。

样本数据集。数据集可能有更多独特的 BrandFlavors 或更少,这就是脚本必须灵活和动态的原因。

在此处输入图像描述

脚本:

import pandas as pd
import warnings
warnings.simplefilter(action='ignore')
excel_file = ('testfile.xlsx')
df = pd.read_excel(excel_file)
df = df.sort_values(by='This', ascending=False)
colarr = df.columns.values
arr = df[colarr[0]].unique()
for i in range(len(arr)):
    globals()['var%s' % i] = df.loc[df[colarr[0]] == arr[i]]
for i in range(len(arr)):
    if globals()['var%s' % i].empty:
        ''
    else: 
        globals()['var%s' % i] = globals()['var%s' % i].append({'BrandFlavor':'Total',
                                'This':globals()['var%s' % i]['This'].sum(),
                                'Last':globals()['var%s' % i]['Last'].sum(),
                                'Diff':globals()['var%s' % i]['Diff'].sum(),
                                '% Chg':globals()['var%s' % i]['Diff'].sum()/globals()['var%s' % i]['Last'].sum() * 100}, ignore_index=True)
        globals()['var%s' % i]['% Chg'].fillna(0, inplace=True)
        globals()['var%s' % i].fillna(' ', inplace=True)

我在下面尝试过,但是列表是一系列字符串

vararr = []
count = 0
for x in range(len(arr)):
    vararr.append('var' + str(count))
    count = count + 1
df = pd.concat([vararr])

pd.concat 无法识别字符串。我厌倦了构建一个定义了 arg 的类,但遇到了同样的问题。

期望的结果将是一个代码片段,它生成一个与第 9/10 行创建的变量匹配的变量列表,并且可以由 pd.concat([ list, of, vars, here ]) 引用。它必须是动态的。谢谢

标签: python-3.xpandasdataframedynamicarguments

解决方案


只是解决手头的问题,你不应该globals用来制作变量,这不是好的做法。您的代码应该进行一些小的修改。

import pandas as pd
import warnings


warnings.simplefilter(action='ignore')

excel_file = ('testfile.xlsx')
df = pd.read_excel(excel_file)
df = df.sort_values(by='This', ascending=False)


def good_dfs(dataframe):
    if dataframe.empty:
        pass
    else:
        this = dataframe.This.sum()
        last = dataframe.Last.sum()
        diff = dataframe.Diff.sum()
        data = {
            'BrandFlavor': 'Total',
            'This': this,
            'Last': last,
            'Diff': diff,
            'Pct Change': diff / last * 100
        }

        dataframe.append(data, ignore_index=True)
        dataframe['Pct Change'].fillna(0.0, inplace=True)
        dataframe.fillna(' ', inplace=True)

        return dataframe

colarr = df.columns.values
arr = df[colarr[0]].unique()
dfs = []

for i in range(len(arr)):
    temp = df.loc[df[colarr[0]] == arr[i]]
    dfs.append(temp)

final_dfs = [good_dfs(d) for d in dfs]
final_df = pd.concat(final_dfs)

虽然我会说,有更简单的方法来完成你想要的而不做所有这些,但这可能是一个单独的问题。


推荐阅读