panda用元素的计数和频率创建数据帧

2024-09-30 10:28:07 发布

您现在位置:Python中文网/ 问答频道 /正文

从以下数据帧df开始:

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

我在试着建造这个建筑:

^{pr2}$

因此,基本上通过列表将每个节点的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]的列表。有没有一种方法可以更简洁地进行分析,以获得所需的输出?在


Tags: namenodedflangindexesitpd
3条回答

我会使用agg函数和tolist()

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')

更换

^{pr2}$

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

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]

在某种程度上,因为您提到(在评论中)速度对于拥有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列是简单类型(int和float),而不是对象。在

考虑到像groupby这样的pandas方法,上面的结构应该比以列表形式存储更容易完成任务,而且几乎可以保证更快,可能更快。我假设您希望使用这种结构进行进一步的处理,但即使不使用,以这种方式将数据制成表格也会更快。在

您可以使用参数^{}^{}使用参数return_counts=True

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

a = df.groupby('node')['lang'].apply(lambda x: np.unique(x, return_counts=True))
                              .reset_index(name='tup')

#split tuples
a[['langs','lfreq']] = a['tup'].apply(pd.Series)
#filter columns
print a[['node','langs','lfreq']]
   node     langs   lfreq
0     1      [it]     [1]
1     2      [en]     [1]
2     3  [ar, es]  [2, 1]
3     5  [es, uz]  [1, 1]

相关问题 更多 >

    热门问题