我正在尝试计算属于某个第一列值的第二列的最小值。 所以我的数据框如下:
name CEMS star ACC CEMS-1 3 ACC CEMS-2 4 ACC CEMS-3 5 ACC CEMS-4 5 ARTi CEMS-1 4 ARTi CEMS-2 5 ARTi CEMS-3 4 ARTi CEMS-4 5
现在我想从CEMS的不同值中在单独的列中为每个名称找到一个最小星值
我希望我的数据框看起来像这样:
Name CEMS star min ACC CEMS-1 3 ACC CEMS-2 4 ACC CEMS-3 5 ACC CEMS-4 5 3 ARTi CEMS-1 4 ARTi CEMS-2 5 ARTi CEMS-3 4 ARTi CEMS-4 5 4
有人可以帮我吗?
答案 0 :(得分:1)
transform
是不够的。您将需要屏蔽除最后一个索引以外的所有内容。您可以执行索引对齐分配。
g = df.groupby('name')['star']
df['minstar'] = pd.Series(g.min(), index=g.apply(pd.Series.last_valid_index))
df.fillna('')
name CEMS star minstar
0 ACC CEMS-1 3
1 ACC CEMS-2 4
2 ACC CEMS-3 5
3 ACC CEMS-4 5 3
4 ARTi CEMS-1 4
5 ARTi CEMS-2 5
6 ARTi CEMS-3 4
7 ARTi CEMS-4 5 4
答案 1 :(得分:0)
您可以将GroupBy
和transform
与min
一起使用。如果您的数据框也按name
排序,则可以将drop_duplicates
用于所需的输出。
df['star_min'] = df.groupby('name')['star'].transform('min')\
.drop_duplicates(keep='last')
print(df)
name CEMS star star_min
0 ACC CEMS-1 3 NaN
1 ACC CEMS-2 4 NaN
2 ACC CEMS-3 5 NaN
3 ACC CEMS-4 5 3.0
4 ARTi CEMS-1 4 NaN
5 ARTi CEMS-2 5 NaN
6 ARTi CEMS-3 4 NaN
7 ARTi CEMS-4 5 4.0
答案 2 :(得分:0)
仅更改最后一个值,如预期输出一样
ind = df.groupby('name', as_index=False).apply(lambda s: s.index[-1])
df.loc[ind, 'min'] = df.groupby('name').star.min().values
name CEMS star min
0 ACC CEMS-1 3 NaN
1 ACC CEMS-2 4 NaN
2 ACC CEMS-3 5 NaN
3 ACC CEMS-4 5 3.0
4 ARTi CEMS-1 4 NaN
5 ARTi CEMS-2 5 NaN
6 ARTi CEMS-3 4 NaN
7 ARTi CEMS-4 5 4.0