熊猫groupby使用多个/具有相同类别的列列表?

时间:2018-10-22 02:02:55

标签: python json pandas pandas-groupby

基本上,我想转向:

    Date    0               
0   10-1    thing1  3
2   10-2    thing1  1
            thing2  1
3   10-3    thing1  2
            thing2  1

进入分组依据:

with open(output, 'w+') as out:
    ::: <<<=== code
    line = line.encode('utf-8').decode('ascii','ignore')`
    out.write(line)

详细信息:基本上,我从JSON导入中获得了一个复杂的“对象”列。这是字典的列表,每个字典都包含另一个包含我感兴趣的内容的列表。我设法将这最后一个列表“展平”到单独的列(上面的0,1,2),并且仅提取了将自身列出到一列(即[0,1,2])。这些列的元素都是相同的类别变量(thing1,thing2等)

我可以想象您可以为1列和2列中的每一个创建新行,并将它们的值存储在0列中,但是如果您可以直接汇总这些值并进行groupby,那就太好了。

4 个答案:

答案 0 :(得分:2)

我将使用get_dummies,因为它还会在10-1中添加thing2之类的缺失级别

pd.get_dummies(df.set_index('Date').replace('None',np.nan),prefix='',prefix_sep='').stack().sum(level=[0,1])
Out[185]: 
Date        
10-1  thing1    3
      thing2    0
10-2  thing1    1
      thing2    1
10-3  thing1    2
      thing2    1
dtype: uint8

答案 1 :(得分:0)

必须有一个更好的方法,但这就是我想到的:

(df.groupby('Date')
   .apply(lambda x: x.drop('Date', axis=1).apply(lambda y: y.value_counts()))
   .sum(axis=1)
   .astype(int))

Date        
10-1  thing1    3
10-2  thing1    1
      thing2    1
10-3  thing1    2
      thing2    1
dtype: int64

答案 2 :(得分:0)

这对我有用:

df.melt(id_vars='Date').groupby('Date')['value'].value_counts()

输出:

Date  value 
10-1  thing1    3
10-2  thing1    1
      thing2    1
10-3  thing1    2
      thing2    1

说明:melt将三个值列中的所有值都放在一个列中,同时保留每个值的日期。然后,我们按日期分组并计算值。

顺便说一句,上面的示例返回了一个包含日期和值的多重索引的序列。如果您想要一个数据框,则可以使用:

df.melt(id_vars='Date').groupby('Date').agg({'value':'value_counts'})

这将返回具有相同结构的实际数据框,因此它仍然具有级别为日期和值的多索引。

答案 3 :(得分:0)

好的,这是另一个答案。这个使用get_dummies是因为我喜欢这个特定的解决方案。但这一次,我将使用thing1和thing2计数列:

pd.get_dummies(df, columns=df.columns[1:], prefix="", prefix_sep="")\
    .groupby(axis=1, level=0).sum().groupby('Date').sum()

结果是:

    thing1  thing2
Date        
10-1    3   0
10-2    1   1
10-3    2   1

我只是觉得这很酷,我想在这里分享它:)