我有一个熊猫数据框,如图所示在这个框架中还有许多列与任务无关。
id pos value sente
1 a I 21
2 b have 21
3 b a 21
4 a cat 21
5 d ! 21
1 a My 22
2 a cat 22
3 b is 22
4 a cute 22
5 d . 22
我想从某些列中列出一个列表,这样第一句话(sente=21)和其他每一句都是这样的。意思是每个句子都有自己独特的词条。
`[('I', 'a', '1'), ..., ('!','d','5')]`
我已经有一个功能可以为一个句子做这个,但是我不知道如何为框架中的所有句子(具有相同句子值的句子)做这个。
`class SentenceGetter(object):
def __init__(self, data):
self.n_sent = 1
self.data = data
self.empty = False
def get_next(self):
for t in self.data:
try:
s = self.data[(self.data["sente"] == 21)]
self.n_sent += 1
return
s["id"].values.tolist(),
s["pos"].values.tolist(),
s["value"].values.tolist()
except:
self.empty = True
return None,None,None
foo = SentenceGetter(df)
sent, pos, token = foo.get_next()
in = zip(token, pos, sent)
`
因为我的框架很大,所以没有办法使用这样的结构:
df.loc[((df["sente"] == df["sente"].shift(-1)) & (df["sente"] == df["sente"].shift(+1))), ["pos","value","id"]]
有什么想法吗?
最佳答案
如果您愿意使用标准库,collections.defaultdict
提供一个O(n)解决方案:
from collections import defaultdict
d = defaultdict(list)
for _, num, *data in df[['sente', 'value', 'pos', 'id']].itertuples():
d[num].append(data)
结果:
defaultdict(list,
{21: [('I', 'a', 1),
('have', 'b', 2),
('a', 'b', 3),
('cat', 'a', 4),
('!', 'd', 5)],
22: [('My', 'a', 1),
('cat', 'a', 2),
('is', 'b', 3),
('cute', 'a', 4),
('.', 'd', 5)]})