【问题标题】:groupby, apply, and set not behaving as expected... is this a bug?groupby、apply 和 set 未按预期运行......这是一个错误吗?
【发布时间】:2014-07-10 18:36:54
【问题描述】:

要查看问题,请考虑以下数据框

In [66]: dat = pandas.DataFrame(['a','b','c','d','e','f','g','h'],
                        columns=['letters'])

In [67]: dat['numbers'] = pandas.Series([1,2,3,4,5,6,7,8])

In [68]: dat['names'] = pandas.Series(['jim','jan','jerry','george'
                        ,'mary','mary','sue','sue'])

In [69]: dat
Out[69]:
  letters  numbers   names
0       a        1     jim
1       b        2     jan
2       c        3   jerry
3       d        4  george
4       e        5    mary
5       f        6    mary
6       g        7     sue
7       h        8     sue

按名称分组

In [78]: dat = dat.groupby(['names'])[['letters']]

现在我尝试连接字母产生了一个有趣的结果:

In [80]: dat.apply(lambda x: '|'.join(set(x)))
Out[80]:
names
george    letters|numbers|names
jan       letters|numbers|names
jerry     letters|numbers|names
jim       letters|numbers|names
mary      letters|numbers|names
sue       letters|numbers|names
dtype: object

以下技巧似乎有效,但为什么我需要再次选择“字母”,为什么上面的输出看起来像它一样?

In [84]: dat.apply(lambda x: '|'.join(set(x['letters'])))
Out[84]:
names
george      d
jan         b
jerry       c
jim         a
mary      e|f
sue       h|g
dtype: object

这可能是一个错误吗?

安装版本

提交:无 蟒蛇:2.7.5.final.0 蟒蛇位:64 操作系统:达尔文 操作系统版本:13.1.0 机器:x86_64 处理器:i386 字节序:很少 LC_ALL:无 LANG: en_US.UTF-8

熊猫:0.13.1 赛通:0.20.1 麻木:1.6.2 scipy:0.11.0 统计模型:0.5.0 IPython:2.0.0 狮身人面像:1.2.2 帕西:0.2.1 scikits.timeseries:无 日期工具:1.5 皮茨:2012d 瓶颈:无 表:无 numexpr:无 matplotlib:1.1.1 openpyxl:无 xlrd:无 xlwt:无 xlsxwriter:无 sqlalchemy:无 lxml:3.3.5 bs4:4.3.2 html5lib:无 bq:无 apiclient:无

【问题讨论】:

    标签: python numpy pandas


    【解决方案1】:

    这可能看起来有点奇怪,但正如你看到的一组 DataFrame 是它的列:

    In [11]: dat
    Out[11]:
      letters  numbers   names
    0       a        1     jim
    1       b        2     jan
    2       c        3   jerry
    3       d        4  george
    4       e        5    mary
    5       f        6    mary
    6       g        7     sue
    7       h        8     sue
    
    [8 rows x 3 columns]
    
    In [12]: set(dat)
    Out[12]: {'letters', 'names', 'numbers'}
    

    这是由于您遍历 DataFrame 的方式(按列)​​:

    In [13]: for i in dat: print(i)
    letters
    numbers
    names
    

    这将与 SeriesGroupBy 一起使用(遍历 Series 遍历其元素):

    In [21]: g = dat.groupby(['names'])['letters']
    
    In [22]: g.apply(lambda x: '|'.join(set(x)))
    Out[22]:
    names
    george      d
    jan         b
    jerry       c
    jim         a
    mary      e|f
    sue       h|g
    dtype: object
    

    注意:您不需要 set,实际上也不需要 lambda:

    In [23]: g.apply('|'.join)
    Out[23]:
    names
    george      d
    jan         b
    jerry       c
    jim         a
    mary      e|f
    sue       g|h
    dtype: object
    

    【讨论】:

    • 总之,不是bug :)
    • @Andy,为什么dat.groupby(['names'])[['letters']] 会通过所有列来应用(字母、数字、名称)?为什么不只是将“字母”列作为数据框而不是系列?是否忽略了[['letters']](不允许的语法糖)?
    • @KarlD。啊哈,那部分 实际上是一个应该在 0.14rc 中修复的错误!不记得 github 上的 # 是 github.com/pydata/pandas/issues/5264 的一部分。
    • 感谢您在 github 上指出我的问题。作为对您的回应...set() 函数是我的应用程序的残余,我希望从类似字母的列中提取独特的元素。
    猜你喜欢
    • 2019-11-04
    • 1970-01-01
    • 2023-03-11
    • 2019-12-26
    • 2017-12-28
    • 1970-01-01
    • 1970-01-01
    • 2014-11-12
    • 1970-01-01
    相关资源
    最近更新 更多