基本上,我想转向:
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,那就太好了。
答案 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
我只是觉得这很酷,我想在这里分享它:)