gpt4 book ai didi

python - 如何为 Pandas 动态创建不同长度的 '&' 过滤器

转载 作者:太空宇宙 更新时间:2023-11-04 02:18:22 27 4
gpt4 key购买 nike

代码的用途:

基于来自主 DataFrame (df) 的输入 (test_tuple & params),生成过滤后的 DataFrame (filtered_df)。可能有数百种过滤器组合。

发帖原因:

这里的一切都会产生预期的输出。也就是说,我不喜欢解决方案 1 的实现方法,其中在 dict 中创建一个虚拟 DataFrame 对象,循环依次过滤和更新该对象。解决方案 1 似乎有点困惑,但我需要一些指导来实现更简洁的内容。

要求:

有没有办法像解决方案 2 中所示那样使用 filter_t

filter_t 格式正确,但它是一个字符串。有没有办法生成 filter_t 以便如图所示使用?

输入示例:

test_tuple = [('Serial Number', [12345]),
('Test Points', ['TestpointA', 'TestpointC']),
('Voltage_1', [3.0, 3.3, 3.6, 0.0]),
('Temperature Setpoint', [0, 60]),
('Slew_1', [200, 400, 800, 1600, 3200, 6400])]
params = ['sn', 'tp', 'v1', 'temp', 'slew']

代码:

for i in itertools.product(*[b for _, b in test_tuple]):
print('\n'.join(f'{a}:{b}' for a, b in zip(params, i)))
name_params = '_'.join(f'{b}{a}' for a, b in zip(params, i))
filter_t = ' & '.join(f'(self.df["{c[0]}"] == {b})' for b, c in zip(i, test_tuple))
print(f'filter_t: {filter_t}')
filter_l = [(c[0], b) for b, c in zip(i, test_tuple)]

filter_t 的格式为字符串:

filter_t: (self.df["Test Points"] == 3P3V) & (self.df["Slew_1"] == 5000)
filter_t: (self.df["Serial Number"] == 2450) & (self.df["Test Points"] == 3P3V) & (self.df["Voltage_1"] == 11.6) & (self.df["Temperature Setpoint"] == 25.0) & (self.df["Slew_1"] == 5000)

filter_l 的格式:

filter_l: [('Test Points', '3P3V_Edge'), ('Slew_1', 200)]
filter_l: [('Serial Number', 1234), ('Test Points', '3P3V'), ('Voltage_1', 11.6), ('Temperature Setpoint', 25.0), ('Slew_1', 200)]

解决方案 1 - 工作正常:

filtered_df = {1: df}
for x in filter_l:
filtered_df[1] = (filtered_df[1].loc[(filtered_df[1][f'{x[0]}'] == x[1])])

解决方案 2 - 可能吗?

df_filter = self.df.loc[filter_t]

过滤器示例:

df_filter = self.df.loc[(self.df['Serial Number'] == 1234) &
(self.df['Test Points'] == '3P3V') &
(self.df['Voltage_1'] == 11.6) &
(self.df['Temperature Setpoint'] == 25.0) &
(self.df['Slew'] == 200)]

最终解决方案@John Zwinck - 谢谢:

filter_t = ' & '.join(f'{c[0]} == "{b}"' for b, c in zip(i, test_tuple))
filtered_df = df.loc[df.eval(filter_t)]

print(f'filter_t: {filter_t}')
>>> filter_t: Test_Points == "3P3V" & Slew_1 == "5000"

最佳答案

如果你可以安装numexpr,我建议尝试DataFrame.query()为此。

首先,您需要将列名称中的空格替换为下划线(或什么都不填)。然后,构建并使用这样的过滤器字符串:

filter_str = 'Serial_Number == 2450 and Test_Points == "3P3V" and Voltage_1 == 11.6'
df_filter = df.query(filter_str)

如果您安装了 numexpr,这可能是最快的解决方案。

或者,构建一个掩码列表,然后将它们组合起来。这类似于但优于您的解决方案 1:

masks = [df[x[0]] == x[1] for x in filter_l] # list of bool arrays
filtered_df = df[np.logical_and.reduce(masks)] # combine and apply masks

关于python - 如何为 Pandas 动态创建不同长度的 '&' 过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52124059/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com