python groupby 分组后如何用每一组的值减去每一组的最小值?

发布于 2022-09-12 04:13:50 字数 1195 浏览 35 评论 0

id    case    eid
1    0    0
3    0    1
4    0    2
7    0    3
9    0    4
11    0    5
2    1    0
5    1    1
6    1    2
8    1    3
10    1    4
12    1    5

数据如上。
image.png

df = pd.read_csv("/content/test.csv")

plt.figure(figsize=(13,10), dpi= 80)
print(df)
sns.boxplot(x='case', y='id', data=df, notch=False)

def add_n_obs(df,group_col,y):
    medians_dict = {grp[0]:grp[1][y].median() for grp in df.groupby(group_col)}
    xticklabels = [x.get_text() for x in plt.gca().get_xticklabels()]
    n_obs = df.groupby(group_col)[y].size().values
    for (x, xticklabel), n_ob in zip(enumerate(xticklabels), n_obs):
        plt.text(x, medians_dict[xticklabel]*1.01, "#obs : "+str(n_ob), horizontalalignment='center', fontdict={'size':14}, color='white')
add_n_obs(df,group_col='case',y='id')    

plt.title('Box Plot of Highway Mileage by Vehicle Class', fontsize=22)
plt.ylim(10)
plt.show()

以上是原始代码。
请问在python中使用pandas从csv文件中读取数据并按照cid分组后,如何将id列各组的值减去所在分组的最小值?

比如现在已经分成了两组,
cid=0的一组id最小值为1,所以id列变为0,2,3,6,8,10;
cid=1的一组id最小值为2,所以id列变为0,3,4,6,8,10。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

深居我梦 2022-09-19 04:13:50

已解决。将print(df)位置换为下面两句即可

min_eachgroup = df.groupby('id')['no'].transform('min') # 获取每个分组的最小值并增量转换为和原来维度相同

df['no'] = df['no'] - min_eachgroup # 每一组的值都减去该组的最小值,即每条迹第2--last个活动到第1个活动的跨度

分组之后所有组的最小值,大小为组的数量,与原数据维度不同,无法直接进行加减。利用transform函数可以将其扩充到和原来维度一样。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文