熊猫:拆分字符串和计数值? [复制]
Posted
技术标签:
【中文标题】熊猫:拆分字符串和计数值? [复制]【英文标题】:pandas: split string, and count values? [duplicate] 【发布时间】:2018-07-08 13:55:30 【问题描述】:我有一个 pandas 数据集,其中有一列是以逗号分隔的字符串,例如1,2,3,10
:
data = [
'id': 1, 'score': 9, 'topics': '11,22,30' ,
'id': 2, 'score': 7, 'topics': '11,18,30' ,
'id': 3, 'score': 6, 'topics': '1,12,30' ,
'id': 4, 'score': 4, 'topics': '1,18,30'
]
df = pd.DataFrame(data)
我想获得topics
中每个值的计数和平均分。所以:
topic_id,count,mean
1,2,5
11,2,8
12,1,6
等等。我该怎么做?
我已经知道了:
df['topic_ids'] = df.topics.str.split()
但现在我想我想把topic_ids
炸开,所以整个值集中的每个唯一值都有一列...?
【问题讨论】:
平均分数是指df.topics.str.split(',',expand=True).astype(int).mean(axis=1)
?
【参考方案1】:
不嵌套然后groupby
和agg
df.topics=df.topics.str.split(',')
New_df=pd.DataFrame('topics':np.concatenate(df.topics.values),'id':df.id.repeat(df.topics.apply(len)),'score':df.score.repeat(df.topics.apply(len)))
New_df.groupby('topics').score.agg(['count','mean'])
Out[1256]:
count mean
topics
1 2 5.0
11 2 8.0
12 1 6.0
18 2 5.5
22 1 9.0
30 4 6.5
【讨论】:
谢谢!不幸的是,我的真实数据在'topics': np.concatenate(df.topics.values)
上出现错误 - 错误是ValueError: all the input arrays must have same number of dimensions
。我认为这是因为拆分数组的长度可变 - 如何处理?
@Richard 你在拆分后把它分配回来了吗?
这是因为我的数据中有一些 NaN
值 - 替换那些解决了问题的值。谢谢!
@Richard aha ,np.nan 会导致问题,你可以更换 nan :-)【参考方案2】:
In [111]: def mean1(x): return np.array(x).astype(int).mean()
In [112]: df.topics.str.split(',', expand=False).agg([mean1, len])
Out[112]:
mean1 len
0 21.000000 3
1 19.666667 3
2 14.333333 3
3 16.333333 3
【讨论】:
【参考方案3】:这是一种方式。重新索引和堆叠,然后是 groupby 和 agg。
import pandas as pd
data = [
'id': 1, 'score': 9, 'topics': '11,22,30' ,
'id': 2, 'score': 7, 'topics': '11,18,30' ,
'id': 3, 'score': 6, 'topics': '1,12,30' ,
'id': 4, 'score': 4, 'topics': '1,18,30'
]
df = pd.DataFrame(data)
df.topics = df.topics.str.split(',')
df2 = pd.DataFrame(df.topics.tolist(), index=[df.id, df.score])\
.stack()\
.reset_index(name='topics')\
.drop('level_2', 1)
df2.groupby('topics').score.agg(['count', 'mean']).reset_index()
【讨论】:
一站式服务。(df.set_index(['id','score']).topics.str.split(',', expand=True) .stack().reset_index(name='Topic') .groupby('Topic').agg('id':'size','score':'mean'))
@ScottBoston 这也可能有用。不止一种方式!以上是关于熊猫:拆分字符串和计数值? [复制]的主要内容,如果未能解决你的问题,请参考以下文章