我有一個資料框,例如:
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
我想添加一個名為newcolumnfirst_Element這將是每一個Groups的元素與最低的 Value,如果有前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
有人有想法嗎?
uj5u.com熱心網友回復:
用戶groupby().transform使用idxmin,然后locaccesss:
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
uj5u.com熱心網友回復:
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
uj5u.com熱心網友回復:
這是使用地圖的一種方法:
(df.assign(first_Element = df['Groups'].map(df.loc[df.groupby('Groups')['Value'].idxmin()]
.set_index('Groups')['Element'])))
uj5u.com熱心網友回復:
一種選擇是對值進行排序、分組,然后選擇每組的第一個值:
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/367734.html
上一篇:抓取html鏈接Python
