Python 使用循环对数据帧中的多列进行筛选
上下文:我在excel中有一个数据,我们通过Pandas对其进行处理以进行清理,然后在ML模型中进一步使用它。在清理过程中,我尝试将基于多列的数据作为OR条件进行过滤。这组列的标题名为开始日期-因此这7列将代表7周。此列的标题名称每周都会更改。因此,我无法保留一致的代码来自动选择标题名 我尝试过的逻辑:我编写了一个代码块,使用此日期列打印“或”条件,然后在dices部分的数据框中复制粘贴此打印语句。下面是它的样子: 我现在正在复制粘贴专栏。但我想我可以通过对列名应用基于类型的条件来构建一个逻辑来标识日期列 样本数据:Python 使用循环对数据帧中的多列进行筛选,python,pandas,dataframe,Python,Pandas,Dataframe,上下文:我在excel中有一个数据,我们通过Pandas对其进行处理以进行清理,然后在ML模型中进一步使用它。在清理过程中,我尝试将基于多列的数据作为OR条件进行过滤。这组列的标题名为开始日期-因此这7列将代表7周。此列的标题名称每周都会更改。因此,我无法保留一致的代码来自动选择标题名 我尝试过的逻辑:我编写了一个代码块,使用此日期列打印“或”条件,然后在dices部分的数据框中复制粘贴此打印语句。下面是它的样子: 我现在正在复制粘贴专栏。但我想我可以通过对列名应用基于类型的条件来构建一个逻辑来
1/20/2019 1/27/2019 2/3/2019 2/10/2019 2/17/2019 2/24/2019 3/3/2019 \
0 0(80CS,8H) 0(80CS) 0(80CS) 0(80CS) 0(80CS) 0(80CS) 0(80CS)
1 0(50CS,8H) 0(50CS) 0(50CS) 0(50CS) 0(50CS) 0(50CS) 0(50CS)
2 0(40CS,8H) 0(40CS) 0(40CS) 0(40CS) 0(40CS) 0(40CS) 0(40CS)
3 0(40CS,8H) 0(40CS) 0(40CS) 0(40CS) 0(40CS) 0(40CS) 0(40CS)
4 0(40CS,8H) 0(40CS) 0(40CS) 0(40CS) 0(40CS) 0(40CS) 0(40CS)
5 0(40CS,8H) 0(40CS) 0(40CS) 0(40CS) 0(40CS) 0(40CS) 0(40CS)
6 12(25CS,8H) 15(25CS) 15(25CS) 15(25CS) 15(25CS) 15(25CS) 15(25CS)
7 11(28CS,8H) 12(28CS) 12(28CS) 12(28CS) 12(28CS) 12(28CS) 12(28CS)
8 8(30CS,8H) 10(30CS) 10(30CS) 10(30CS) 2(30CS,32T) 10(30CS) 10(30CS)
9 0(40CS,8H) 0(40CS) 0(40CS) 0(40CS) 0(40CS) 0(40CS) 0(40CS)
3/10/2019 3/17/2019 3/24/2019 3/31/2019 4/7/2019
0 0(80CS) 0(80CS) 0(80CS) 0(80CS) 0(80CS)
1 0(50CS) 0(50CS) 0(50CS) 0(50CS) 0(50CS)
2 0(40CS) 0(40CS) 0(40CS) 0(40CS) 0(40CS)
3 0(40CS) 0(40CS) 0(40CS) 0(40CS) 0(40CS)
4 0(40CS) 0(40CS) 0(40CS) 0(40CS) 0(40CS)
5 0(40CS) 0(40CS) 0(40CS) 0(40CS) 0(40CS)
6 15(25CS) 15(25CS) 15(25CS) 20(20CS) 20(20CS)
7 12(28CS) 12(28CS) 12(28CS) 12(28CS) 12(28CS)
8 10(30CS) 10(30CS) 10(30CS) 10(30CS) 10(30CS)
9 0(40CS) 0(40CS) 0(40CS) 0(40CS) 0(40CS)
avail_col = ['1/20/2019',
'1/27/2019', '2/3/2019', '2/10/2019', '2/17/2019', '2/24/2019',
'3/3/2019', '3/10/2019', '3/17/2019', '3/24/2019', '3/31/2019',
'4/7/2019']
##changing the data type of selected columns
for i in avail_col:
avail_dat[i] = avail_dat[i].astype(str).apply(lambda x: x.split('(')[0])
avail_dat[i] = avail_dat[i].str.replace('-','0')
avail_dat[i] = avail_dat[i].astype(float)
or_str = ''
for i in avail_col:
or_str = "(avail_dat['"+i+"'] >= 24) | "
print(or_str)
显然,我无法将变量传递给数据帧进行过滤,或者我还不知道如何进行过滤,所以我将打印的语句复制粘贴到下面的代码中以过滤数据帧
avail_dat = avail_dat[(avail_dat['1/20/2019'] >= 24) |
(avail_dat['1/27/2019'] >= 24) |
(avail_dat['2/3/2019'] >= 24) |
(avail_dat['2/10/2019'] >= 24) |
(avail_dat['2/17/2019'] >= 24) |
(avail_dat['2/24/2019'] >= 24) |
(avail_dat['3/3/2019'] >= 24) |
(avail_dat['3/10/2019'] >= 24) |
(avail_dat['3/17/2019'] >= 24) |
(avail_dat['3/24/2019'] >= 24) |
(avail_dat['3/31/2019'] >= 24) |
(avail_dat['4/7/2019'] >= 24)
]
是否有一种方法可以传递变量而不是每次复制粘贴 您可以分别执行每个过滤器,然后在以后合并它们。像这样:
import numpy as np
# add all your boolean series to a list
all_masks = []
for col in avail_col:
condition = (avail_dat[col] >= 24)
all_masks.append(condition)
# use numpy to select the rows where any record evaluates to True
mask = np.array(all_masks).any(axis=0)
avail_dat.loc[mask]
您可以分别执行每个过滤器,然后在以后合并它们。像这样:
import numpy as np
# add all your boolean series to a list
all_masks = []
for col in avail_col:
condition = (avail_dat[col] >= 24)
all_masks.append(condition)
# use numpy to select the rows where any record evaluates to True
mask = np.array(all_masks).any(axis=0)
avail_dat.loc[mask]
哇。这里有很多事情要考虑 首先,我认为您可以通过选择列做得更好。例如,您可以执行以下操作来生成所需列的列表(因为您说过它们以7天为增量): 然后,您可以执行以下操作:
df_avail = df.filter(columns_you_want)
最后,类似于:
df_avail[df_avail>24].dropna(how='any',axis=0)
这似乎是您想要的,但我不确定最后一步是什么,因为您没有提供任何所需的输出。Woah。这里有很多事情要考虑 首先,我认为您可以通过选择列做得更好。例如,您可以执行以下操作来生成所需列的列表(因为您说过它们以7天为增量): 然后,您可以执行以下操作:
df_avail = df.filter(columns_you_want)
最后,类似于:
df_avail[df_avail>24].dropna(how='any',axis=0)
这似乎是您想要的,但我不确定最后一步是什么,因为您没有提供任何所需的输出。如果我理解正确,您正在比较括号前的数字,而忽略减号。如果是这样,您可以尝试转置dataframe,然后应用extract函数,或者您也可以使用您编写的split函数,如果您实际使用小数,这可能会更好:
dft = df.transpose()
for col in dft.columns:
dft[col] = dft[col].str.extract(r'-?([0-9]+)\(.*').astype(float)
mask = dft >= 24
如果我理解正确,您正在比较括号前的数字,而忽略减号。如果是这样,您可以尝试转置dataframe,然后应用extract函数,或者您也可以使用您编写的split函数,如果您实际使用小数,这可能会更好:
dft = df.transpose()
for col in dft.columns:
dft[col] = dft[col].str.extract(r'-?([0-9]+)\(.*').astype(float)
mask = dft >= 24
提供上述和预期输出的样本数据提供上述和预期输出的样本数据在此公式中,您将离开此公式中名为“更改所选列的数据类型”的部分,您将离开名为“更改所选列的数据类型”的部分抱歉,我忘了提到avail_dat df中还有其他列。在这种情况下,转置不是最好的方法对不起,我忘了提到avail_dat df中还有其他列。在这种情况下,转置不是最好的方法