这是对我的数据帧结构的更新,我匆忙地制定了结构,我检查了一个用户并模拟了这个结构。@lilistence的评论:“数据意外满足这个条件”也是正确的,value_counts和cum_sum()解决了这个问题。但是用户的用户名也会发生变化,如果不同的用户有相同的文本,那么他们可以拥有相同的meet_id。在
更新的数据帧结构:
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&meet_id]列上分组,并以这样的方式连接label列,使该组中频率较高的标签保持不变,而第二个最频繁的标签将连接第一个标签,最后一个标签将连接所有标签。在
更新的数据帧输出是我正在寻找的
^{pr2}$这样可以得到:
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的标签是被拾取的,忽略了用户的不同。我的错!在
现在,由于还必须考虑用户_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
标签的数据类型为object。我们应该改用astype吗。非常感谢大家帮助我。在
编辑:好吧,更简单的解决方案:
我丑陋的尝试:
^{pr2}$输出:
您可以尝试以下方法:
如果您想去掉
^{pr2}$set
数据类型,并将其作为字符串(如您所需的输出中所示),则可以应用', '.join(sorted(set(x))))
,而不是简单地set
(谢谢@Wen和@ScottBoston):value_counts
和{value_counts
按递减计数排序也包括
^{pr2}$sorted
调整单词而不是单个字符
旧答案
使用
transform
和自定义的累积唯一函数缩短版
每个评论
由liliscent
我们可以先按
meet_id
和组大小排序相关问题 更多 >
编程相关推荐