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

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

以下 hack 似乎有效,但为什么我需要再次选择“字母”,为什么上面的输出看起来如此?
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

这可能是一个错误吗?

安装版本

提交:无
python :2.7.5.final.0
python 位:64
操作系统:达尔文
操作系统版本:13.1.0
机器:x86_64
处理器:i386
字节序:小
LC_ALL:无
语言:en_US.UTF-8

Pandas :0.13.1
赛通:0.20.1
NumPy :1.6.2
scipy:0.11.0
统计模型:0.5.0
IPython:2.0.0
狮身人面像:1.2.2
帕齐:0.2.1
scikits.timeseries:无
日期工具:1.5
pytz:2012d
瓶颈:无
表:无
numexpr:无
matplotlib:1.1.1
openpyxl:无
xlrd:无
xlwt:无
xlsxwriter:无
sqlalchemy:无
lxml: 3.3.5
BS4:4.3.2
html5lib:无
烧烤:无
apiclient: 无

最佳答案

这可能看起来有点奇怪,但正如您看到的一组 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

关于python - groupby、apply 和 set 没有按预期运行......这是一个错误吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23794707/

10-12 01:29
查看更多