【问题标题】:How do I add a dynamic list of variable to the command pd.concat如何将变量的动态列表添加到命令 pd.concat
【发布时间】:2023-03-05 08:09:01
【问题描述】:

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

  • 在不同的数据集长度(行)和唯一值之间保持动态 - 已完成
  • 从 A 列获取唯一值,并为每个唯一条目创建单独的数据框作为变量 - 已完成
  • 将总计添加到每个数据框的底部 - 已完成
  • 将单独的数据帧重新连接在一起 - 不完整

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

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

脚本:

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 的类,但遇到了同样的问题。

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

【问题讨论】:

  • 请不要使用globals 来制作变量,这不是好习惯
  • 你能试着减少你的问题吗?我很难理解您要解决的问题
  • MattR:问题表述为:问题是我无法制定一种方法来创建正在使用的变量列表并将它们作为 arg 应用于命令 pd.concat。跨度>
  • AWS_apprentice: 只是一个糟糕的形象,我会更新它。 ty
  • AWS_apprentice:如果不是全局变量,还有什么更好的方法来创建变量?

标签: python-3.x pandas dataframe dynamic arguments


【解决方案1】:

只是解决手头的问题,您不应该使用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)

虽然我会说,有很多更简单的方法可以在不做所有这些的情况下完成你想要的,但这可能是一个单独的问题。

【讨论】:

  • 感谢您的回复:您的代码生成的错误与我的相同,但是代码更简洁 TypeError: cannot concatenate object of type '';只有 Series 和 DataFrame obj 是有效的
  • 还有。文件“”,第 14 行 continue ^ SyntaxError: 'continue' not proper in loop 。我必须将 continue 替换为 ' ' 才能继续
  • 太棒了,谢谢你的帮助。我仍在学习 python,到目前为止,它主要是 bash 脚本。我仍处于拼凑其他不良做法的阶段。感谢像您这样愿意抽出时间帮助他人学习的人。
猜你喜欢
  • 2021-11-28
  • 2021-08-21
  • 2018-08-01
  • 2021-11-28
  • 2015-07-04
  • 2015-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多