这是对我的DataFrame结构的更新,我在仓促中制定了结构,我正在检查单个用户并模拟该结构。 @liliscent的评论:"数据意外地满足了这个条件"也是如此,value_counts和cum_sum()解决了它。但是,user_id也会发生变化,如果不同的用户拥有相同的文字,则可以拥有相同的meet_id。
更新了DataFrames结构:
mytable = pd.DataFrame({'user_id': [ '3c', '3c', '3c', '3c','3c', '3c', '3c', '3c', '3c', '3c', '3c', '3c', '3c', '3d',
'3d', '3d', '3d', '3e', '3e', '3r', '3w', '3w', '3w', '3w'],
'meet_id': [1,1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,4,5,6,1,2,1,1], 'text': ['abc', 'abc', 'abc', 'abc', 'abc', 'abc', 'abc',
'xyz', 'xyz', 'xyz', 'xyz', 'xyz', 'xyz', 'npq', 'npq', 'npq', 'npq', 'tt', 'op', 'li', 'abc', 'xyz', 'abc', 'abc'], 'label': ['A', 'A', 'A', 'A', 'A','B', 'B', 'B', 'B', 'B',
'C', 'C', 'A', 'G', 'H', 'H', 'H', 'A', 'A', 'B', 'E', 'G', 'B', 'B']})
mytable = mytable[['user_id', 'meet_id', 'text', 'label']] # ordering columns in the way I would like to be printed out.
user_id meet_id text label
3c 1 abc A
3c 1 abc A
3c 1 abc A
3c 1 abc A
3c 1 abc A
3c 1 abc B
3c 1 abc B
3c 2 xyz B
3c 2 xyz B
3c 2 xyz B
3c 2 xyz C
3c 2 xyz C
3c 2 xyz A
3d 3 npq G
3d 3 npq H
3d 3 npq H
3d 3 npq H
3e 4 tt A
3e 5 op A
3r 6 li B
3w 1 abc E
3w 2 xyz G
3w 1 abc B
3w 1 abc B
我想在[user_id& amp; meet_id]列并连接标签列,使得该组的频率较高的标签保持不变,而第二个最常用的标签将连接第一个标签,最后一个标签将连接所有标签。
更新的DataFrame输出是我正在寻找的
mytable_pro = pd.DataFrame({'user_id': ['3c', '3c', '3c', '3c','3c', '3c', '3c', '3c', '3c', '3c', '3c', '3c', '3c','3d',
'3d', '3d', '3d', '3e', '3e', '3r', '3w', '3w', '3w', '3w'],
'meet_id': [1,1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,4,5,6,1,2,1,1], 'text': ['abc', 'abc', 'abc', 'abc', 'abc', 'abc', 'abc',
'xyz', 'xyz', 'xyz', 'xyz', 'xyz', 'xyz','npq', 'npq', 'npq', 'npq', 'tt', 'op', 'li', 'abc', 'xyz', 'abc', 'abc' ], 'label': ['A', 'A', 'A', 'A', 'A', 'B,A', 'B,A', 'B', 'B', 'B',
'B, C', 'B, C', 'A,B,C', 'H,G', 'H', 'H', 'H', 'A', 'A', 'B', 'E,B', 'G', 'B', 'B']})
mytable_pro = mytable_pro[['user_id', 'meet_id', 'text', 'label']] # ordering columns in the way I would like to be printed out.
这给出了:
user_id meet_id text label
3c 1 abc A
3c 1 abc A
3c 1 abc A
3c 1 abc A
3c 1 abc A
3c 1 abc B,A
3c 1 abc B,A
3c 2 xyz B
3c 2 xyz B
3c 2 xyz B
3c 2 xyz B, C
3c 2 xyz B, C
3c 2 xyz A,B,C
3d 3 npq H,G
3d 3 npq H
3d 3 npq H
3d 3 npq H
3e 4 tt A
3e 5 op A
3r 6 li B
3w 1 abc E,B
3w 2 xyz G
3w 1 abc B
3w 1 abc B
@piRSquared给出的答案:
mytable.groupby('meet_id').label.value_counts().groupby('meet_id').apply(
lambda d: d.index.to_series().str[1].cumsum().str.join(', '))
对于我问过的错误问题,是正确的答案,非常感谢,非常抱歉。它解决了前面提到的排序问题,但如果不同的用户具有相同的meet_id则无法工作。只是为了详尽无遗,如果标签频率对于一个组来说是相同的,那么标签中的哪一个与另一个连接起来并不重要。
它给出了:
user_id meet_id text label
3c 1 abc A
3c 1 abc A
3c 1 abc A
3c 1 abc A
3c 1 abc A
3c 1 abc A, B
3c 1 abc A, B
3c 2 xyz B
3c 2 xyz B
3c 2 xyz B
3c 2 xyz B, C
3c 2 xyz B, C
3c 2 xyz B, C, A
3d 3 npq H, G
3d 3 npq H
3d 3 npq H
3d 3 npq H
3e 4 tt A
3e 5 op A
3r 6 li B
3w 1 abc A, B, E
3w 2 xyz B, C, A, G
3w 1 abc A, B
3w 1 abc A, B
3w的标签是关闭的,因为meet_id的标签被拾取而忽略了user_id的区别。我的错!
现在,由于还必须考虑user_id,我尝试了以下内容:
s = mytable.groupby(['user_id', 'meet_id']).label.value_counts().groupby(['user_id, 'meet_id']).apply(
lambda d: d.index.to_series().str[1].cumsum().str.join(', '))
这引发:
AttributeError: Can only use .str accessor with string values, which use np.object_ dtype in pandas
啊!另一个小更新,实际上我的标签栏中有单词。
dummy_boo = pd.DataFrame({'user_id': ['3g', '3g', '3g'], 'meet_id': [9,9,9], 'text': ['baby', 'baby', 'baby'], 'label':['hello', 'hello', 'why']}
输出:
user_id meet_id text label
3g 9 baby hello
3g 9 baby hello
3g 9 baby why
应用上面的代码会导致每个字符用逗号分隔。
user_id meet_id text label
3g 9 baby h, e, l, l, o
3g 9 baby h, e, l, l, o
3g 9 baby h, e, l, l, o, w, h, y
相反,我需要:
user_id meet_id text label
3g 9 baby hello
3g 9 baby hello
3g 9 baby hello, why
标签的dtype是对象。我们应该使用astype吗?非常感谢大家帮助我。
答案 0 :(得分:8)
value_counts
和cumsum
value_counts
按降序排序
cols = ['meet_id', 'user_id']
s = mytable.groupby(cols).label.value_counts().groupby(cols).apply(
lambda d: d.index.to_series().str[-1].cumsum().str.join(', ')
)
mytable.assign(label=[s.get((a, b, c)) for a, b, c in mytable[cols + ['label']].values])
user_id meet_id text label
0 3c 1 abc A
1 3c 1 abc A
2 3c 1 abc A
3 3c 1 abc A
4 3c 1 abc A
5 3c 1 abc A, B
6 3c 1 abc A, B
7 3c 2 xyz B
8 3c 2 xyz B
9 3c 2 xyz B
10 3c 2 xyz B, C
11 3c 2 xyz B, C
12 3c 2 xyz B, C, A
13 3d 3 npq H, G
14 3d 3 npq H
15 3d 3 npq H
16 3d 3 npq H
17 3e 4 tt A
18 3e 5 op A
19 3r 6 li B
20 3w 1 abc B, E
21 3w 2 xyz G
22 3w 1 abc B
23 3w 1 abc B
sorted
cols = ['meet_id', 'user_id']
s = mytable.groupby(cols).label.value_counts().groupby(cols).apply(
lambda d: d.index.to_series().str[-1].cumsum().apply(sorted).str.join(', ')
)
mytable.assign(label=[s.get((a, b, c)) for a, b, c in mytable[cols + ['label']].values])
user_id meet_id text label
0 3c 1 abc A
1 3c 1 abc A
2 3c 1 abc A
3 3c 1 abc A
4 3c 1 abc A
5 3c 1 abc A, B
6 3c 1 abc A, B
7 3c 2 xyz B
8 3c 2 xyz B
9 3c 2 xyz B
10 3c 2 xyz B, C
11 3c 2 xyz B, C
12 3c 2 xyz A, B, C
13 3d 3 npq G, H
14 3d 3 npq H
15 3d 3 npq H
16 3d 3 npq H
17 3e 4 tt A
18 3e 5 op A
19 3r 6 li B
20 3w 1 abc B, E
21 3w 2 xyz G
22 3w 1 abc B
23 3w 1 abc B
调整单词而不是单个字符
cols = ['meet_id', 'user_id']
s = mytable.groupby(cols).label.value_counts().groupby(cols).apply(
lambda d: d.index.to_series().str[-1].add('|').cumsum().apply(
lambda e: ', '.join(sorted(e.strip('|').split('|')))
)
)
mytable.assign(label=[s.get((a, b, c)) for a, b, c in mytable[cols + ['label']].values])
使用transform
和自定义累积唯一函数
from collections import Counter
def cum_unique(x):
return pd.Series(list(map(
Counter, x
))).cumsum().str.join(', ')
mytable.assign(label=mytable.groupby('meet_id').label.transform(cum_unique))
user_id meet_id text label
0 3c 1 abc A
1 3c 1 abc A
2 3c 1 abc A
3 3c 1 abc A
4 3c 1 abc A
5 3c 1 abc A, B
6 3c 1 abc A, B
7 3c 2 xyz B
8 3c 2 xyz B
9 3c 2 xyz B
10 3c 2 xyz B, C
11 3c 2 xyz B, C
12 3c 2 xyz B, C, A
缩短版
mytable.assign(label=mytable.groupby('meet_id').label.transform(
lambda x: pd.Series(list(map(Counter, x))).cumsum().str.join(', ')
))
每条评论
我们可以先按meet_id
和小组尺寸
sizes = mytable.groupby(['meet_id', 'label']).label.transform('size')
m1 = mytable.assign(sizes=sizes).sort_values(
['meet_id', 'sizes'], ascending=[True, False]).drop('sizes', 1)
m1
m1.assign(label=m1.groupby('meet_id').label.transform(
lambda x: pd.Series(list(map(Counter, x))).cumsum().str.join(', ')
)).reindex(mytable.index)
答案 1 :(得分:3)
mytable['label'] = mytable.groupby(['user_id','meet_id','text'])['label']\
.apply(lambda x: x.cumsum()).apply(lambda x: sorted(set(x)))
我的丑陋尝试:
mytable['label'] = mytable.groupby(['user_id','meet_id','text'])['label']\
.apply(lambda x: x.cumsum().str.extractall('(.)')\
.groupby(level=0)[0].apply(lambda x: sorted(set(x))))
输出:
user_id meet_id text label
0 3c 1 abc [A]
1 3c 1 abc [A]
2 3c 1 abc [A]
3 3c 1 abc [A]
4 3c 1 abc [A]
5 3c 1 abc [A, B]
6 3c 1 abc [A, B]
7 3c 2 xyz [B]
8 3c 2 xyz [B]
9 3c 2 xyz [B]
10 3c 2 xyz [B, C]
11 3c 2 xyz [B, C]
12 3c 2 xyz [A, B, C]