@rfan 的答案当然有效,作为替代方案,这是一种使用 pandas 的方法groupby http://pandas.pydata.org/pandas-docs/stable/groupby.html.
The .groupby()
按“b”列对数据进行分组 -sort=False
是保持订单完整所必需的。这.apply()
对每组 b 数据应用一个函数,在本例中将字符串连接在一起,并用空格分隔。
In [67]: df.groupby('b', sort=False)['a'].apply(' '.join)
Out[67]:
b
DT The
Org Skoll Foundation
, ,
VBN based
IN in
Location Silicon Valley
Name: a, dtype: object
EDIT:
为了处理更一般的情况(重复的非连续值) - 一种方法是首先添加一个哨兵列,用于跟踪每行适用于哪一组连续数据,如下所示:
df['key'] = (df['b'] != df['b'].shift(1)).astype(int).cumsum()
然后将键添加到 groupby 中,即使使用重复的值,它也应该可以工作。例如,使用具有重复的虚拟数据:
df = DataFrame({'a': ['The', 'Skoll', 'Foundation', ',',
'based', 'in', 'Silicon', 'Valley', 'A', 'Foundation'],
'b': ['DT', 'Org', 'Org', ',', 'VBN', 'IN',
'Location', 'Location', 'Org', 'Org']})
应用分组依据:
In [897]: df.groupby(['key', 'b'])['a'].apply(' '.join)
Out[897]:
key b
1 DT The
2 Org Skoll Foundation
3 , ,
4 VBN based
5 IN in
6 Location Silicon Valley
7 Org A Foundation
Name: a, dtype: object