集中趋势测度:均值与中位数孰优?及行级数据替换逻辑问询
嘿,我来帮你搞定这两个问题!
问题1:均值 vs 中位数,哪种集中趋势测度更优?
其实没有绝对的「谁更优」,完全得看你的数据情况:
- 如果你的数据是对称分布(比如经典的正态分布),而且没有极端值捣乱,均值是更好的选择——它用到了所有数据点的信息,能精准反映整体的平均水平。
- 但如果数据里有极端值(比如某城市某天温度突然飙到100℃,或者低到-20℃),或者是偏态分布(比如收入数据,少数人赚得特别多),那中位数就靠谱多了——它只看中间位置的数值,完全不受极端值的影响,能代表最「典型」的那个值。
简单总结:对称无极端选均值,偏态有极端选中位数!
问题2:温度数据集的后续逻辑实现(以Python pandas为例)
假设你已经用pandas算出了每行的均值,接下来咱们一步步完成剩下的逻辑:
第一步:明确需求细节
我们要对每行做这几件事:
- 统计该行中小于均值的数据点占比是否≥50%
- 如果满足条件,就把整行的城市温度值替换为该行的均值;不满足的话,就替换为该行的中位数
第二步:代码实现
先按你提供的温度数据构造示例数据集:
import pandas as pd # 按你给出的温度值创建DataFrame(你提到20个城市但只提供了16个值,这里先按实际数据处理) temp_data = { 'city1': [23], 'city2': [34], 'city3': [45], 'city4': [56], 'city5': [34], 'city6': [56], 'city7': [26], 'city8': [54], 'city9': [12], 'city10': [23], 'city11': [33], 'city12': [64], 'city13': [34], 'city14': [67], 'city15': [31], 'city16': [42] } df = pd.DataFrame(temp_data) # 你已经完成的均值计算 df['row_mean'] = df.mean(axis=1)
接下来完成剩余逻辑:
# 1. 计算每行的中位数 df['row_median'] = df.median(axis=1) # 2. 筛选出所有城市温度的列(避免误操作后面生成的辅助列) city_columns = [col for col in df.columns if col.startswith('city')] # 3. 统计每行中小于均值的数据点占比 df['pct_less_than_mean'] = df[city_columns].apply(lambda row: (row < row.mean()).mean(), axis=1) # 4. 判断是否满足「50%数据点小于均值」的条件 df['condition_met'] = df['pct_less_than_mean'] >= 0.5 # 5. 根据条件替换整行数据 for index, row in df.iterrows(): if row['condition_met']: # 满足条件,用均值替换整行城市列 df.loc[index, city_columns] = row['row_mean'] else: # 不满足,用中位数替换 df.loc[index, city_columns] = row['row_median'] # 若不需要中间辅助列,可以删除它们 df = df.drop(['row_mean', 'row_median', 'pct_less_than_mean', 'condition_met'], axis=1)
代码小解释
- 用
df.median(axis=1)计算每行中位数,为后续替换做准备; - 用列表推导式筛选城市列,避免误操作辅助列;
apply结合lambda函数,快速统计每行小于均值的数据占比;- 最后遍历每行,根据条件完成整行替换。
内容的提问来源于stack exchange,提问作者stone rock
相关产品推荐
相关产品推荐

