我在pandas python中有这样的数据框(combined_ranking_df
):
Id Rank Activity
0 14035 8.0 deployed
1 47728 8.0 deployed
2 24259 1.0 NaN
3 24259 6.0 WIP
4 14251 8.0 deployed
5 14250 1.0 NaN
6 14250 6.0 WIP
7 14250 5.0 NaN
8 14250 5.0 NaN
9 14250 1.0 NaN
我正在尝试获取每个id的最大值。例如,14250它应该是6.0。 24259它应该是6.0。
Id Rank Activity
0 14035 8.0 deployed
1 47728 8.0 deployed
3 24259 6.0 WIP
4 14251 8.0 deployed
6 14250 6.0 WIP
我尝试了combined_ranking_df.groupby(['Id'], sort=False)['Rank'].max()
,但我实现的结果是第一个dataframe
(没有改变)。
我做错了什么?
答案 0 :(得分:9)
选项1
与@ ayhan的回答相同here
这通过对每个'Id'
组的最后位置中保留最大值的数据帧进行排序来回答问题。 pd.DataFrame.drop_duplicates
使我们能够保留每个组的第一个或最后一个。然而,这是一个非常快速的方便巧合。它没有概括说每个'Id'
的前两个。
df.sort_values('Rank').drop_duplicates('Id', 'last')
Id Rank Activity
3 24259 6.0 WIP
6 14250 6.0 WIP
0 14035 8.0 deployed
1 47728 8.0 deployed
4 14251 8.0 deployed
您可以在最后对索引进行排序
df.sort_values('Rank').drop_duplicates('Id', 'last').sort_index()
Id Rank Activity
0 14035 8.0 deployed
1 47728 8.0 deployed
3 24259 6.0 WIP
4 14251 8.0 deployed
6 14250 6.0 WIP
选项2
groupby
和idxmax
这是我认为解决这个问题最惯用的方法。 @ MaxU的答案是推广到每n
最大'Id'
的最佳方式。
df.loc[df.groupby('Id', sort=False).Rank.idxmax()]
Id Rank Activity
0 14035 8.0 deployed
1 47728 8.0 deployed
3 24259 6.0 WIP
4 14251 8.0 deployed
6 14250 6.0 WIP
答案 1 :(得分:6)
IIUC:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<table>
<tr class="jsgrid-edit-row">
<td class="jsgrid-cell jsgrid-align-left" style="width: 100px;">
<select>
<option value="1">SW</option>
<option value="2">HW</option>
</select>
</td>
<td class="jsgrid-cell jsgrid-align-left" style="width: 80px;">
<input type="text" />
</td>
<td class="jsgrid-cell jsgrid-align-left" style="width: 100px;">
<select>
<option value="1">COMPUTER</option>
<option value="2">MONITOR</option>
<option value="3">NETWORK COMPONENTS</option>
<option value="4">OFFICE EQUIPMENT</option>
<option value="5">SOFTWARE</option>
<option value="6">STORAGE</option>
</select>
</td>
<td class="jsgrid-cell jsgrid-align-left" style="width: 80px;">
<input type="text" />
</td>
<td class="jsgrid-cell jsgrid-align-left" style="width: 80px;">
<input type="text" />
</td>
<td class="jsgrid-cell jsgrid-align-left" style="width: 80px;">
<input type="text" />
</td>
</tr>
</table>
或来自@piRSquared的更好的版本:
In [40]: df.groupby('Id', as_index=False, sort=False) \
.apply(lambda x: x.nlargest(1, ['Rank'])) \
...: .reset_index(level=1, drop=True)
Out[40]:
Id Rank Activity
0 14035 8.0 deployed
1 47728 8.0 deployed
2 24259 6.0 WIP
3 14251 8.0 deployed
4 14250 6.0 WIP
答案 2 :(得分:4)
尝试存储它,然后查阅存储的{
"StackId": stackidarn,
"ResponseURL": "http://pre-signed-S3-url-for-response",
"ResourceProperties": {
"StackName": "stack-name",
"List": [
"1",
"2",
"3"
]
},
"RequestType": "Create",
"ResourceType": "Custom::TestResource",
"RequestId": "unique id for this create request",
"LogicalResourceId": "MyTestResource"
}
groupedby
答案 3 :(得分:3)
您可以创建一个布尔索引来检查给定Rank
的{{1}}是否等于其最大值。然后使用布尔索引从数据帧中提取最大值。
使用Id
groupby
在[{1}}的帮助下创建了掩码,该Id
保留了数据帧的原始尺寸。
transform