python-3.x - 如何将变量的动态列表添加到命令 pd.concat
问题描述
我正在使用 python3 和 pandas 创建一个脚本,它将:
- 在不同的数据集长度(行)和唯一值之间保持动态 - 已完成
- 从 A 列获取唯一值并创建单独的数据框作为每个唯一条目的变量 - 已完成
- 将总计添加到每个数据框的底部 - 已完成
- 将单独的数据帧重新连接在一起 - 不完整
问题是我无法制定一种方法来创建正在使用的变量列表并将它们作为 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 ]) 引用。它必须是动态的。谢谢
解决方案
只是解决手头的问题,你不应该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)
虽然我会说,有更简单的方法来完成你想要的而不做所有这些,但这可能是一个单独的问题。
推荐阅读
- javascript - 单击时检索表行值的自定义函数
- python - 如何使用神经网络从有关特定主题的句子中提取相关短语?
- django - 更改密码后不要在 django 中重定向我想要的页面
- r - 使用 geom_line 和 geom_ribbon 绘制两个具有均值和 sd 的 df
- android - Android:在 SQLite 中交换数据是个好主意吗?
- json - 以字符串形式获取请求正文的 JSON 表示
- python - 当 asyncio transport.get_extra_info('peername') 返回 None 时?
- python - 如何从python中的数据框中删除“未命名”行?
- c# - 如果我的 aspnet mvc 应用程序以“.NET Core 3.1”为目标,它会针对什么点版本运行?
- python - 难以分配张量元素(张量不可散列,无法分配函数来调用)