python - 对 Pandas df 中的列组合进行详尽搜索
问题描述
我正在对 Pandas df 中的列组合进行详尽的搜索。没有目标函数,因此没有优化。只是一系列详尽的 df 过滤。
我有一套标准化的文件。对于每一个,我构建了一个 df,其结构如下:
客户'A'、'B'、'C'、...'K'、'Metric1'、'Metric2'、'Metric3'
AK 列是我希望过滤 df 的特征。使用 itertools,我从这些 cols 中创建了 5 的所有独特组合。
列 'Metric1' - 'Metric3' 包含其他值,一旦 df 被过滤,我想计算这些值的平均值。
df 有一个索引“客户”。
# Features
featureList = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K']
numInputs = 5
# Build a list of unique parameter combinations (list of tuples)
AllParms = []
AllParms = list(itertools.combinations(featureList, numInputs))
# Create a list of integers to identify the iteration, i1, i2, i3, etc.
iteration = list(range(1, len(AllParms) + 1))
# Loop thru files
for file in filenames:
# Read data file.
df = pd.read_csv(file, index_col='Customer', header=0)
# Loop thru parameter sets
for j in range(len(AllParms)):
'''
Get a unique parameter set (an element from the list of tuples).
Parse tuple into variables to create df booleans
Get parms from 'AllParms' and iteration number from 'iteration'
'''
parmToIterate = AllParms[j]
parmn = 'i' + str(iteration[j])
parmA = parmToIterate[0]
parmB = parmToIterate[1]
parmC = parmToIterate[2]
parmD = parmToIterate[3]
parmE = parmToIterate[4]
concatStr = parmA + '_' + parmB + '_' + parmC + '_' + parmD + '_' + parmE
''' Filter df '''
# Method 1
df[parmn] = (
(df[parmA] > 0) &
(df[parmB] > 0) &
(df[parmC] > 0) &
(df[parmD] > 0) &
(df[parmE] > 0)).astype(str)
df2 = df.loc[df[parmn].isin(['True'])]
# Method 2
Cond1 = df[parmA] > 0
Cond2 = df[parmB] > 0
Cond3 = df[parmC] > 0
Cond4 = df[parmD] > 0
Cond5 = df[parmE] > 0
AllCond = Cond1 & Cond2 & Cond3 & Cond4 & Cond5
df2 = df[AllCond]
''' Calc Metrics for Filtered Rows'''
Metric1_mean = round(df2['Metric1'].mean(),3)
Metric2_mean = round(df2['Metric2'].mean(),3)
Metric3_mean = round(df2['Metric3'].mean(),3)
''' Join metrics for all parm sets and unique parm string '''
问题:
上面的代码工作正常,但我读过很多关于动态创建 df 列的负面评论。从列表或元组创建 df[ 元素 ] = 有什么问题?当通过一组cols循环时,有什么替代方法?
方法 2 比方法 1 快 6.7 倍。我知道方法 1 是纯逐行操作,但方法 2 也不是吗?
解决方案
1.您可以尝试:
conditions = (df[list_of_columns]>0).all(1)
- 问题是方法 1 将布尔值转换为字符串并比较字符串,这通常比较慢。
推荐阅读
- bash - 具有特定名称范围的 Bash 列表文件
- python - 我的“python”命令和“which python”指向不同的python版本
- php - 在数组内的字符串中保留换行符
- twitter - Twitter Card Images 在 Gatsby 应用程序上不起作用
- javascript - 在 d3js 中使用 join 方法时出现无效的合并错误
- flutter - 为什么 textbutton 不符合 ROW 中的普通文本
- python - 即使在单独的线程中运行后台进程后,Tkinter GUI 也会冻结
- python - FastApi - api 密钥作为参数足够安全
- spring - 加载资源失败:服务器响应状态为 404 (Not Found) Angular12 Spring boot
- python - 如何在 Pygame 中使用类来缩小此代码段?