dict_nb={[1,2,3]:[4,5]}#多层循环效率不高 for i in range(0, df2.shape[0]): #循环,如果df2的列表中,每行第1列等于GOOD,且第4列等于字典键的第二个值(此处为2),第5列等于字典键的第三个值(此处为3)if df2.values[i][1] == "GOOD" and df2.values[i][4] == list(dict_nb.keys())[0][1] and df2.values[i][5] ==list(dict_nb.keys())[0][2]:print(dict_nb[("GOOD", df2.values[i][4], df2.values[i][5])]) #打印该字典的值## 使用pandas的向量化操作更高效 first_key = list(dict_nb.keys())[0] #字典的键列表化 filtered_df = df2[(df2.iloc[:, 1] == "GOOD") & (df2.iloc[:, 4] == first_key[1]) & (df2.iloc[:, 5] == first_key[2])]for index, row in filtered_df.iterrows():key = ("GOOD", row[4], row[5])print(dict_nb[key])
################# 加入循环 #######################
# 使用pandas提高效率
for key, dict_value in dict_nb.items():code, val1, val2 = key# 使用pandas的布尔索引mask = ((df2.iloc[:, 1] == code) & #选择df2的第2,5,6列的所有行,创建一个布尔序列,表示第2,5,6列的值是否等于 code,val1,val2,如果mask为True表示满足所有条件
(df2.iloc[:, 4] == val1) & (df2.iloc[:, 5] == val2))matching_rows = df2[mask] #使用布尔索引,只返回 mask
为 True 的行if not matching_rows.empty: #检查筛选结果是否为空,如果不为空,则打印字典值
print(f"字典值: {dict_value}")
向量化操作是指使用 Pandas/NumPy 的内置函数对整个数据集进行操作,而不是使用 Python 循环。这些操作在底层使用编译语言(如 C 或 Fortran)实现,比 Python 循环快几个数量级。
常见的向量化操作
1. 算术运算 python # 基本算术运算 df['add'] = df['A'] + df['B'] # 加法 df['subtract'] = df['A'] - df['B'] # 减法 df['multiply'] = df['A'] * df['B'] # 乘法 df['divide'] = df['A'] / df['B'] # 除法 df['power'] = df['A'] ** 2 # 幂运算# 使用 numpy 函数 df['sqrt'] = np.sqrt(df['A']) # 平方根 df['log'] = np.log(df['A']) # 对数 2. 比较运算 python # 比较操作 df['greater'] = df['A'] > df['B'] # 大于 df['equal'] = df['A'] == df['B'] # 等于 df['between'] = (df['A'] >= 10) & (df['A'] <= 50) # 介于# 多条件组合 condition = (df['A'] > 50) | (df['B'] < 20) # 或条件 df['complex_condition'] = condition 3. 字符串操作 python # 创建字符串数据 df_str = pd.DataFrame({'name': ['Alice', 'Bob', 'Charlie', 'David'],'email': ['alice@email.com', 'bob@test.com', 'charlie@mail.org', 'david@example.com'] })# 字符串向量化操作 df_str['name_upper'] = df_str['name'].str.upper() # 大写 df_str['name_length'] = df_str['name'].str.len() # 长度 df_str['domain'] = df_str['email'].str.split('@').str[1] # 提取域名 df_str['contains_test'] = df_str['email'].str.contains('test') # 包含检测 4. 日期时间操作 python # 创建日期数据 df_date = pd.DataFrame({'date': pd.date_range('2023-01-01', periods=5),'value': [10, 20, 30, 40, 50] })# 日期向量化操作 df_date['year'] = df_date['date'].dt.year # 提取年份 df_date['month'] = df_date['date'].dt.month # 提取月份 df_date['day_name'] = df_date['date'].dt.day_name() # 星期几 df_date['next_week'] = df_date['date'] + pd.Timedelta(days=7) # 日期加减 5. 条件逻辑操作 python # 使用 np.where df['category'] = np.where(df['A'] > 50, 'High', 'Low')# 使用 np.select 处理多个条件 conditions = [df['A'] < 20,(df['A'] >= 20) & (df['A'] < 50),df['A'] >= 50 ] choices = ['Low', 'Medium', 'High'] df['level'] = np.select(conditions, choices, default='Unknown') 6. 分组聚合操作 python # 分组向量化操作 df_grouped = df.groupby('category').agg({'A': ['mean', 'std', 'min', 'max'],'B': 'sum' })# 分组后应用函数 df['group_mean'] = df.groupby('category')['A'].transform('mean')