熊猫:拆分字符串和计数值? [复制]

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】:

不嵌套然后groupbyagg

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 这也可能有用。不止一种方式!

以上是关于熊猫:拆分字符串和计数值? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在熊猫的列中存储字符串值数组? [复制]

根据变长分隔符拆分熊猫字符串列

如何拆分熊猫字符串以提取中间名?

如何在熊猫中显示类似空字符串的列值的计数

我如何在熊猫中分组然后对值求和? [复制]

拆分(分解)熊猫数据框字符串条目以分隔行