基本上,我想转到:
Date 0 1 2
0 10-1 thing1 None None
1 10-1 thing1 thing1 None
2 10-2 thing2 thing1 None
3 10-3 thing1 thing1 thing2
分成一组:
Date 0
0 10-1 thing1 3
2 10-2 thing1 1
thing2 1
3 10-3 thing1 2
thing2 1
Details:基本上,我有一个来自JSON导入的复杂的"object“列。这是一个字典列表,每一个都包含有我感兴趣的内容的另一个列表。我已经成功地将这个最终列表“扁平化”成单独的列(上面的0,1,2),也成功地将列表本身解压缩到列中(即0,1,2)。这些列的元素都是相同的分类变量(thing1、thing2等)。
我可以想象,您可以为1列和2列中的每一列创建新行,将它们的值存储在0列中,但是如果您能够直接聚合这些值和groupby,那就太好了。
发布于 2018-10-22 02:30:29
我将使用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
发布于 2018-10-22 02:17:15
一定有更好的办法,但我想到的是:
(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
发布于 2018-10-22 02:21:06
这对我来说很管用:
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'})
它返回具有相同结构的实际数据,因此它仍然有一个包含级别、日期和值的多索引。
https://stackoverflow.com/questions/52921527
复制相似问题