导入
使用 pipe() 进行函数链式调用
了解如何在 pandas 中使用 pipe() 方法将函数串联起来。
零售交易数据集
| OrderID | CustomerID | Product | Quantity | Price | OrderDate | ReviewScore |
|---|---|---|---|---|---|---|
| 1 | 1012 | 樱桃 | 2 | 21.98 | 2023-08-30 | 5.0 |
| 2 | 1015 | 枣子 | 5 | 44.45 | 2023-08-28 | NaN |
| 3 | 1012 | 樱桃 | 1 | 12.35 | 2023-08-13 | 3.0 |
| 4 | 1003 | 苹果 | 1 | 7.16 | 2023-08-01 | 4.0 |
| 5 | 1003 | 黑莓 | 2 | 16.26 | 2023-08-13 | 4.0 |
| 6 | 1007 | 樱桃 | 1 | 19.55 | 2023-08-30 | NaN |
| 7 | 1003 | 枣子 | 3 | 34.17 | 2023-08-05 | 3.0 |
1# 查看零售交易数据框 2print(df) 3 4# 查看数据类型 5print('\n数据类型') 6print(df.dtypes)
1# pipe() 方法语法 2df.pipe(func, *args, **kwargs)
1# 将列转换为 datetime64[ns] 类型的函数 2def convert_date_dtype(df, col_name): 3 # 创建 DataFrame 的副本以避免修改原始数据 4 new_df = df.copy() 5 6 new_df[col_name] = pd.to_datetime(new_df[col_name]) 7 8 return new_df
1# 将指定列中的 NaN 值替换为 0 的函数 2def map_nan_to_zero(df, col_name): 3 new_df = df.copy() 4 5 # 将指定列中的 NaN 值填充为 0 6 new_df[col_name].fillna(0, inplace=True) 7 8 return new_df
1# 标准化指定列数值的函数 2def standardize_values(df, col_name): 3 new_df = df.copy() 4 min_val = new_df[col_name].min() 5 max_val = new_df[col_name].max() 6 7 # 使用最小-最大缩放将数值标准化到 0 到 1 之间 8 new_df[col_name] = (new_df[col_name] - min_val) / (max_val - min_val) 9 10 return new_df
1# 将 DataFrame 中指定列的值限制在最大值内的函数 2def cap_value(df, col_name): 3 max_value = 40 # 定义最大值 4 new_df = df.copy() 5 new_df[col_name] = new_df[col_name].apply(lambda x: min(x, max_value)) 6 7 return new_df
1# 为每个客户计算价格值的整数排名的函数 2def get_price_rank(df): 3 new_df = df.copy() 4 new_df['PriceRank'] = (new_df 5 .groupby(['CustomerID'])['Price'] 6 .rank(ascending=False) 7 .astype('int64')) 8 9 return new_df
1# 在列前添加字符串前缀的函数 2def prepend_prefix(df, col_name, prefix): 3 new_df = df.copy() 4 new_df[col_name] = prefix + new_df[col_name].astype(str) 5 6 return new_df
1# 将函数串联使用 2df_processed = (df.pipe(convert_date_dtype, 'OrderDate') # 将 "OrderDate" 列的数据类型从 object 转换为 datetime64[ns] 3 .pipe(map_nan_to_zero, 'ReviewScore') # 将 "ReviewScore" 列中的 NaN 值替换为 0 4 .pipe(standardize_values, 'ReviewScore') # 将 "ReviewScore" 列的值标准化到 0 到 1 之间 5 .pipe(cap_value, 'Price') # 将 "Price" 列的值上限设为 40.0 6 .pipe(get_price_rank) # 为每位客户的交易商品价格获取排名 7 .pipe(prepend_prefix, 'CustomerID', 'CUST') # 在每个客户 ID 前添加前缀 "CUST" 8 ) 9 10# 查看处理后的结果 11print(df_processed) 12print('\n数据类型') 13print(df_processed.dtypes)