【问题标题】:Add a new column with lowest value within groups在组中添加一个具有最低值的新列
【发布时间】:2021-11-26 19:48:54
【问题描述】:
我有一个数据框,例如:
Groups Value Element
G1 1 A
G1 4 B
G1 6 C
G2 2 D
G2 1 E
G3 7 F
G3 4 G
G3 2 H
G3 2 I
我想添加一个名为 first_Element 的新列,如果有前任,这将是 Element 和 lowest Value 的每个 Groups aequo,然后拿第一个。
然后我应该得到:
Groups Value Element first_Element
G1 1 A A
G1 4 B A
G1 6 C A
G2 2 D E
G2 1 E E
G3 7 F H
G3 4 G H
G3 2 H H
G3 2 I H
请问有人有意见吗?
【问题讨论】:
标签:
python
python-3.x
pandas
【解决方案1】:
用户groupby().transform 和idxmin,然后loc 访问:
min_loc = df.groupby('Groups')['Value'].transform('idxmin')
df['first_element'] = df.loc[min_loc, 'Element'].to_numpy()
输出:
Groups Value Element first_element
0 G1 1 A A
1 G1 4 B A
2 G1 6 C A
3 G2 2 D E
4 G2 1 E E
5 G3 7 F H
6 G3 4 G H
7 G3 2 H H
8 G3 2 I H
【解决方案2】:
df = df.merge(pd.DataFrame(df.groupby('Groups').apply(lambda x: x['Element'][x['Value'].idxmin()]), columns=['first_Element']).reset_index(), on='Groups')
输出:
>>> df
Groups Value Element first_Element
0 G1 1 A A
1 G1 4 B A
2 G1 6 C A
3 G2 2 D E
4 G2 1 E E
5 G3 7 F H
6 G3 4 G H
7 G3 2 H H
8 G3 2 I H
【解决方案3】:
这是使用地图的一种方式:
(df.assign(first_Element = df['Groups'].map(df.loc[df.groupby('Groups')['Value'].idxmin()]
.set_index('Groups')['Element'])))
【解决方案4】:
一个选项是对值进行排序,分组,然后选择每组的第一个值:
first = (df.sort_values(['Groups', 'Value'])
.groupby('Groups', sort = False)
.Element
.transform('first')
)
df.assign(first_Element = first)
Groups Value Element first_Element
0 G1 1 A A
1 G1 4 B A
2 G1 6 C A
3 G2 2 D E
4 G2 1 E E
5 G3 7 F H
6 G3 4 G H
7 G3 2 H H
8 G3 2 I H
另一个选项是对值进行排序,删除重复项并合并回原始数据框;这避免了 groupby,可能更有效(只是一个假设):
trimmed = (df.sort_values(['Groups', 'Value'])
.drop(columns='Value')
.drop_duplicates(subset='Groups')
.rename(columns={'Element':'first_Element'})
)
df.merge(trimmed, on='Groups')
Groups Value Element first_Element
0 G1 1 A A
1 G1 4 B A
2 G1 6 C A
3 G2 2 D E
4 G2 1 E E
5 G3 7 F H
6 G3 4 G H
7 G3 2 H H
8 G3 2 I H