我有一个pandas数据框,如下所示。该框架中有许多列对于任务而言并不重要。
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')]`
我已经有了一个函数来为一个句子执行此操作,但我无法弄清楚如何对框架中的所有句子(具有相同sente值的句子)执行此操作。
`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"]]
有什么想法吗?
答案 0 :(得分:2)
如果您愿意使用标准库,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)]})
答案 1 :(得分:2)
您还可以使用groupby
和apply
功能。
方法1:它提供了一个数据框
(df
.groupby('sente')
.apply(lambda df: list(tuple(x) for x in df[['value','pos','id']].values))
.reset_index()
.rename(columns={0: 'values'}))
sente values
0 21 [(I, a, 1), (have, b, 2), (a, b, 3), (cat, a, ...
1 22 [(My, a, 1), (cat, a, 2), (is, b, 3), (cute, a...
方法2:它提供了一个字典
(df
.groupby('sente')
.apply(lambda df: list(tuple(x) for x in df[['value','pos','id']].values))
.reset_index()
.set_index('sente')[0].to_dict())
答案 2 :(得分:1)
与@ YOLO的答案基本相同
def f(df):
s = df[['value','pos','id']].apply(tuple, axis=1)
return s.tolist()
g = df.groupby('sente')
q = g.apply(f)
>>> type(q)
<class 'pandas.core.series.Series'>
>>> q[21]
[('I', 'a', 1), ('have', 'b', 2), ('a', 'b', 3), ('cat', 'a', 4), ('!', 'd', 5)]
>>> q[22]
[('My', 'a', 1), ('cat', 'a', 2), ('is', 'b', 3), ('cute', 'a', 4), ('.', 'd', 5)]
>>> q.tolist()
[[('I', 'a', 1), ('have', 'b', 2), ('a', 'b', 3), ('cat', 'a', 4), ('!', 'd', 5)], [('My', 'a', 1), ('cat', 'a', 2), ('is', 'b', 3), ('cute', 'a', 4), ('.', 'd', 5)]]
>>>
>>> q.to_dict()
{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)]}
>>>