【问题标题】: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)

标签: python pandas


【解决方案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 这也可能有用。不止一种方式!
    猜你喜欢
    • 2023-02-03
    • 1970-01-01
    • 2015-06-25
    • 2015-11-20
    • 2021-08-05
    • 2019-02-12
    • 1970-01-01
    • 2020-10-16
    • 2022-06-11
    相关资源
    最近更新 更多