Python 熊猫-按一列分组,按另一列排序,从第三列获取值
我想获取pandas dataframe,按一列对其进行分组,按另一列对其进行排序,并从第三列中获取第一个元素,然后填充原始dataframe 这是我的原始df。我想按col_1分组,按col_2(升序)排序,从col_3中提取第一个元素,并用结果填充col_4Python 熊猫-按一列分组,按另一列排序,从第三列获取值,python,pandas,sorting,group-by,Python,Pandas,Sorting,Group By,我想获取pandas dataframe,按一列对其进行分组,按另一列对其进行排序,并从第三列中获取第一个元素,然后填充原始dataframe 这是我的原始df。我想按col_1分组,按col_2(升序)排序,从col_3中提取第一个元素,并用结果填充col_4 df_in = pd.DataFrame({'col_1':['A', 'A', 'A', 'B', 'B', 'B'], 'col_2': [5,9,2, 3,7,1], 'col_3': ['c
df_in = pd.DataFrame({'col_1':['A', 'A', 'A', 'B', 'B', 'B'], 'col_2': [5,9,2, 3,7,1],
'col_3': ['c','d','k','n','l','f']})
[
以下是输出df的外观:
df_out = pd.DataFrame({'col_1':['A', 'A', 'A', 'B', 'B', 'B'], 'col_2': [5,9,2, 3,7,1],
'col_3': ['c','d','k','n','l','f'], 'col_4': ['k','k','k','f','f','f'], })
我可以用group和transform完成分组和排序,但如何提取第一个元素还不清楚
很抱歉,无法正确显示图像;-(请尝试,因为您的索引如图所示
df_in.sort_values('col_2', inplace=True)
df_in['col_4'] = df_in.groupby('col_1').col_3.transform('first')
df_in.sort_index(inplace=True)
输出:
+----+---------+---------+---------+---------+
| | col_1 | col_2 | col_3 | col_4 |
|----+---------+---------+---------+---------|
| 0 | A | 5 | c | k |
| 1 | A | 9 | d | k |
| 2 | A | 2 | k | k |
| 3 | B | 3 | n | f |
| 4 | B | 7 | l | f |
| 5 | B | 1 | f | f |
+----+---------+---------+---------+---------+
col_1 col_2 col_3 col_4
0 A 5 c k
1 A 9 d k
2 A 2 k k
3 B 3 n f
4 B 7 l f
5 B 1 f f
col_1 col_2 col_3 col_4
0 A 5 c k
1 A 9 d k
2 A 2 k k
3 B 3 n f
4 B 7 l f
5 B 1 f f
你可以用
first_values = df_in.sort_values(['col_1','col_2']).groupby('col_1')['col_3'].first().rename('col_4')
df_in = df_in.join(first_values, on='col_1')
输出:
+----+---------+---------+---------+---------+
| | col_1 | col_2 | col_3 | col_4 |
|----+---------+---------+---------+---------|
| 0 | A | 5 | c | k |
| 1 | A | 9 | d | k |
| 2 | A | 2 | k | k |
| 3 | B | 3 | n | f |
| 4 | B | 7 | l | f |
| 5 | B | 1 | f | f |
+----+---------+---------+---------+---------+
col_1 col_2 col_3 col_4
0 A 5 c k
1 A 9 d k
2 A 2 k k
3 B 3 n f
4 B 7 l f
5 B 1 f f
col_1 col_2 col_3 col_4
0 A 5 c k
1 A 9 d k
2 A 2 k k
3 B 3 n f
4 B 7 l f
5 B 1 f f
尝试一些不同的东西
idxmin
s=df_in.groupby(['col_1']).col_2.transform('idxmin')
df_in['New']=df_in.col_3.reindex(s).values
df_in
Out[469]:
col_1 col_2 col_3 New
0 A 5 c k
1 A 9 d k
2 A 2 k k
3 B 3 n f
4 B 7 l f
5 B 1 f f
输出:
+----+---------+---------+---------+---------+
| | col_1 | col_2 | col_3 | col_4 |
|----+---------+---------+---------+---------|
| 0 | A | 5 | c | k |
| 1 | A | 9 | d | k |
| 2 | A | 2 | k | k |
| 3 | B | 3 | n | f |
| 4 | B | 7 | l | f |
| 5 | B | 1 | f | f |
+----+---------+---------+---------+---------+
col_1 col_2 col_3 col_4
0 A 5 c k
1 A 9 d k
2 A 2 k k
3 B 3 n f
4 B 7 l f
5 B 1 f f
col_1 col_2 col_3 col_4
0 A 5 c k
1 A 9 d k
2 A 2 k k
3 B 3 n f
4 B 7 l f
5 B 1 f f
@anky_91与我的答案类似,只是您不需要按
col_1
排序。是否需要sort_值(['col_1','col_2'])
,我只需要按col_2排序。可能sort_值(['col_2'])
不够吗?