首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >熊猫:在群组函数中选择符合某些标准的行

熊猫:在群组函数中选择符合某些标准的行
EN

Stack Overflow用户
提问于 2017-07-07 03:13:17
回答 1查看 67关注 0票数 0

巴迪:我有一份数据,就像:

代码语言:javascript
复制
df = pd.DataFrame({'code':'A','A','A','A','A','A','B','B','B', 'B','B','B'), 'Times': (1,2,3,4,5,6,1,2,3,4,5,6),'Figure':(2.3,4.1,5.2,7.0,1.8,9.0,4.2,7.9,4.6,1.4,9.7,1.2)})

所以这样的结构:

代码语言:javascript
复制
>>> df
    Figure  Times code
0      2.3      1    A
1      4.1      2    A
2      5.2      3    A
3      7.0      4    A
4      1.8      5    A
5      9.0      6    A
6      4.2      1    B
7      7.9      2    B
8      4.6      3    B
9      1.4      4    B
10     9.7      5    B
11     1.2      6    B

现在我想在每个代码组('A','B')中,只计算[4,1,6,1,3,2]中的Times对时的数字差异。因此,所需的新数据格式将如下所示:

代码语言:javascript
复制
>>> newdf
  code  diffFigure diffTimes
0    A         4.7       4-1
1    A         6.7       3-2
2    A         1.1       6-1
3    B        -3.3       4-1
4    B        -2.8       3-2
5    B        -3.0       6-1

当然,我想使用groupby函数并应用一个函数:

代码语言:javascript
复制
def f(x):
    myList = [[4,1],[6,1],[3,2]]
    for i in x.itertuples():
        for j in x.itertuples():
            if (i.Times, j.Times) in myList:
                print (i.code + ": " + str(i.Times) + "-" + str(j.Times) + "=" + str(i.Figure - j.Figure))
newdf = df.groupby('code').apply(f)

但我无法得到想要的数据。这里有两个问题:首先,是否有可能不使用迭代来枚举所有行?其次,在函数f中,如何设计返回格式以得到所需的数据?

非常感谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-07 04:06:46

有两种可能的解决办法:

要么利用.unstack()

代码语言:javascript
复制
df = pd.DataFrame({'code':('A','A','A','A','A','A','B','B','B', 'B','B','B'), 'Times': (1,2,3,4,5,6,1,2,3,4,5,6),'Figure':(2.3,4.1,5.2,7.0,1.8,9.0,4.2,7.9,4.6,1.4,9.7,1.2)})
df = df.set_index(["code","Times"]).unstack()

并手动连接for循环中的差异,即:

代码语言:javascript
复制
myList = [[4,1],[6,1],[3,2]]
pd.concat(((df[('Figure',d1)] - df[('Figure',d0)]).to_frame('diffFigure').assign(diffTimes="{}-{}".format(d1,d0)) for (d1,d0) in myList))

或列出每个代码中所有可能的组合:

代码语言:javascript
复制
df0 = df.merge(df, on = 'code')

然后,通过将myList转换为dataframe并执行内部连接操作,获取myList中的对子集:

代码语言:javascript
复制
df0 = df0.merge(pd.DataFrame(myList, columns = ['Times_x','Times_y']))
df0['diffFigure'] = df0.Figure_x - df0.Figure_y
df0['diffTimes'] = df0.Times_x.astype(str) + '-' + df0.Times_y.astype(str)

df0[['code','diffFigure','diffTimes']]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44961976

复制
相关文章

相似问题

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