python - DataFrame 在对 groupby 值应用函数后创建新列
问题描述
我有这样一个数据框:
用一个最小的例子:
d = {'Subject': [1,1,1,1,2,2,3,3,3,3,3,3,3],
'Pattern': [1,1,2,2,3,3,2,2,2,2,2,2,2],
'Time': [0.85, 0.92, 1.03, 1.06, 0.89, 0.85, 1.20, 1.03, 1.25, 100.03, 1.97,0.23,0.64]}
df = pd.DataFrame(data=d)
其中Subject
范围从 1 到 8 和Pattern
从 1 到 3。我想在分组后创建一个新列,Subject
并应用一个函数从与 groupby 关联Pattern
的列表中删除异常值。Time
现在我有一个运行良好的解决方案,但我想知道是否会有更优雅的解决方案,以便我学习如何更好地与 DataFrame 交互。举个例子,它应该输出:
Subject Pattern Time Time_2
0 1 1 0.85 0.85
1 1 1 0.92 0.92
2 1 2 1.03 1.03
3 1 2 1.06 1.06
4 2 3 0.89 0.89
5 2 3 0.85 0.85
6 3 2 1.20 1.20
7 3 2 1.03 1.03
8 3 2 1.25 1.25
9 3 2 100.03 0.00 # <---
10 3 2 1.97 1.97
11 3 2 0.23 0.23
12 3 2 0.64 0.64
我当前的代码:
def remove_outliers(arr):
elements = np.array(arr)
mean = np.mean(elements)
sd = np.std(elements)
return [x if (mean - 2 * sd < x < mean + 2 * sd) else 0 for x in arr]
df_g = df.groupby(['Subject', 'Pattern'])['Time']
times = []
keys = list(df_g.groups.keys())
for i, l in enumerate(df_g.apply(list)):
times.append((keys[i], remove_outliers(l)))
df['Time_2'] = 0
for k, l in times:
vals = df[(df['Subject'] == k[0]) & (df['Pattern'] == k[1])].index.values
df['Time_2'].iloc[vals] = l
解决方案
试试这个 -
- 使用 groupby
transform
组获取每行的 GroupWise 平均值和标准差。 check
接下来使用这些系列对象根据您的功能创建您的条件。- 接下来将其反转并用于
df.mask
屏蔽此范围之外的值,并用 0 填充它们。
grouper = df.groupby(['Subject', 'Pattern'])['Time']
mean = grouper.transform('mean')
std = grouper.transform('std').fillna(0)
check = (df['Time'] < (mean - 2*std)) | (df['Time'] > (mean + 2*std))
df['Time_new'] = df['Time'].mask(check).fillna(0)
print(df)
Subject Pattern Time Time_new
0 1 1 0.85 0.85
1 1 1 0.92 0.92
2 1 2 1.03 1.03
3 1 2 1.06 1.06
4 2 3 0.89 0.89
5 2 3 0.85 0.85
6 3 2 1.20 1.20
7 3 2 1.03 1.03
8 3 2 1.25 1.25
9 3 2 100.03 0.00 #<---
10 3 2 1.97 1.97
11 3 2 0.23 0.23
12 3 2 0.64 0.64
注意:对于您的示例,添加 3 标准偏差条件的 Jsut范围太高。尝试 2标准。
推荐阅读
- python - 分类模型中对抗性攻击的排列范数
- cookies - 响应中的 Set-Cookie 标头未设置 Cookie
- c# - 将字典列表值的字符串更改为运行代码
- firebase - 测试由 firestore 事件触发的 firebase 函数
- python - 如何进行进程间通信?
- php - 使用下划线值字符串从数组创建多层 json 结构
- ml.net - 使用单个 MLContext 的多个管道
- javascript - 推送到多维数组返回填充数组
- r - 在 R 中添加直到今天日期的行
- arduino-uno - 从 'int' 到 'char*' 的无效转换 [-fpermissive]