pandas - 使用元素的计数和频率创建数据框

时间:2016-03-09 19:49:11

标签: python pandas

从以下数据框df开始:

df = pd.DataFrame({'node':[1,2,3,3,3,5,5],'lang':['it','en','ar','ar','es','uz','es']})

我试图构建结构:

    node     langs   lfreq
0      1      [it]     [1]
1      2      [en]     [1]
2      3  [ar, es]  [2, 1]
3      5  [uz, es]  [1, 1]

所以基本上将lang元素和每个节点的频率分组到一行中。到目前为止我做了什么:

# Getting the unique langs / node
a = df.groupby('node')['lang'].unique().reset_index(name='langs')

# Getting the frequency of lang / node
b = df.groupby('node')['lang'].value_counts().reset_index(name='lfreq')
c = b.groupby('node')['lfreq'].unique().reset_index(name='lfreq')

然后合并到node

d = pd.merge(a,c,on='node')

在此操作之后,我获得的是:

    node     langs   lfreq
0      1      [it]     [1]
1      2      [en]     [1]
2      3  [ar, es]  [2, 1]
3      5  [uz, es]     [1]

正如您可能已经注意到的那样,最后一行只有[1]个频率出现[uz, es],而不是预期的[1,1]列表。有没有办法以更简洁的方式执行分析以获得所需的输出?

3 个答案:

答案 0 :(得分:3)

我会使用agg函数和tolist()

+----+----+---------+
|user|item|fav_items|
+----+----+---------+
|  u1|   1|[1, 2, 3]|
|  u1|   4|[1, 2, 3]|
+----+----+---------+

+----+----+---------+------+
|user|item|fav_items|result|
+----+----+---------+------+
|  u1|   1|[1, 2, 3]|     1|
|  u1|   4|[1, 2, 3]|     0|
+----+----+---------+------+

替换

df = pd.DataFrame({'node':[1,2,3,3,3,5,5],'lang':['it','en','ar','ar','es','uz','es']})
# Getting the unique langs / node
a = df.groupby('node')['lang'].unique().reset_index(name='langs')

# Getting the frequency of lang / node
b = df.groupby('node')['lang'].value_counts().reset_index(name='lfreq')

c = b.groupby('node')['lfreq'].unique().reset_index(name='lfreq')

和中提琴:

c = b.groupby('node').agg({'lfreq': lambda x: x.tolist()}).reset_index()

d = pd.merge(a,c,on='node')

答案 1 :(得分:2)

您可以apply np.unique使用参数$('c')

return_counts=True

答案 2 :(得分:2)

部分是因为你提到(在评论中)速度对于拥有4000万行的重要性,我建议你看看更接近以下内容的东西。

df.groupby(['node','lang'])['lang'].count()

node  lang
1     it      1
2     en      1
3     ar      2
      es      1
5     es      1
      uz      1

一般来说,使用更平坦的结构(python的zen)会更好,更具体地说,你希望你的pandas / numpy列是简单类型(整数和浮点数),而不是对象。

由于像groupby这样的pandas方法,上面的结构应该比你作为列表存储更容易做事,并且几乎可以保证更快,可能更快。我假设您希望使用此结构进行进一步处理,但即使没有,也会以这种方式将数据制表更快。