首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何枚举组中具有非唯一值的pandas中的行

如何枚举组中具有非唯一值的pandas中的行
EN

Stack Overflow用户
提问于 2018-08-09 21:59:34
回答 1查看 941关注 0票数 0

我正在使用探险地理数据。根据探险ID (ID)、日期( date )、纬度(Lat)、经度(Lon)和一些值(Val,枚举不合理),您是否可以帮助枚举同一站点的站点和记录?假设station是一组具有相同( ID,Date,Lat,Lon)的行,expedition是具有相同ID的一组行。数据帧按4列排序,如示例所示。

Dataset and required columns

代码语言:javascript
运行
复制
import pandas as pd
data = [[1,'2017/10/10',70.1,30.4,10],\
    [1,'2017/10/10',70.1,31.4,20],\
    [1,'2017/10/10',70.1,31.4,10],\
    [1,'2017/10/10',70.1,31.4,10],\
    [1,'2017/10/12',70.1,31.4,20],\
    [2,'2017/12/10',70.1,30.4,20],\
    [2,'2017/12/10',70.1,31.4,20]];

df = pd.DataFrame(data,columns=['ID','Date','Lat','Lon','Val']);

另外(我需要它,St代表站号,Rec代表同一站数据中的记录号;输出例如上述):

代码语言:javascript
运行
复制
df['St'] = [1,2,2,2,3,1,2];
df['Rec'] = [1,1,2,3,1,1,1];
print(df)

我尝试并使用groupby/cumcount/agg/factorize,但没有解决我的问题。

有什么帮助吗!谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-09 22:23:15

要创建'St',您可以在'ID'上使用groupby,然后使用shift检查列'Date','Lat','Lon'any是否与前一个不同,并使用cumsum获取您想要的数字,例如:

代码语言:javascript
运行
复制
df['St'] = (df.groupby(['ID'])
              .apply(lambda x: (x[['Date','Lat','Lon']].shift() != x[['Date','Lat','Lon']])
                               .any(axis=1).cumsum())).values

要创建'Rec',您还需要groupby,但在所有列上使用'ID','Date','Lat','Lon',然后使用cumcountadd,如下所示:

代码语言:javascript
运行
复制
df['Rec'] = df.groupby(['ID','Date','Lat','Lon']).cumcount().add(1)

然后你会得到:

代码语言:javascript
运行
复制
   ID        Date   Lat   Lon  Val  St  Rec
0   1  2017/10/10  70.1  30.4   10   1    1
1   1  2017/10/10  70.1  31.4   20   2    1
2   1  2017/10/10  70.1  31.4   10   2    2
3   1  2017/10/10  70.1  31.4   10   2    3
4   1  2017/10/12  70.1  31.4   20   3    1
5   2  2017/12/10  70.1  30.4   20   1    1
6   2  2017/12/10  70.1  31.4   20   2    1
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51769016

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档