Pandas 计算值列表的唯一值
Pandas count unique values for list of values
我想知道如何根据另一个值计算某些列中的唯一值。我的 DataFrame 如下所示:
id_user id_track
1 1
1 2
1 4
3 1
3 1
3 4
1 1
2 5
基本上我有一个 table,其中包含用户 ID 和他们收听的歌曲。我想为每个用户计算,他听了多少首独特的歌曲,并按这个值排序。输出应该是这样的:
id_user uniqueTracks
1 3
3 2
2 1
我试过这样做(hearings是我的DataFrame):
uniqueTracks=[] #list of numbers of unique tracks
for i in range(len(hearings['id_user'].unique())):
uniqueTracks.append(len(hearings[hearings['id_user']==i['titles'].unique()))
但是对于 2700 万行和 70k 独立用户的 table,它的运行速度非常慢。有谁知道如何在 Pandas 中执行此操作?提前谢谢你:)
使用 groupby.nunique()
计算每个用户的唯一值,并使用 sort_values
对结果进行排序:
df.groupby('id_user')['id_track'].nunique().sort_values(ascending=False)
#id_user
#1 3
#3 2
#2 1
#Name: id_track, dtype: int64
要以数据框的形式返回结果,reset_index
:
df.groupby('id_user')['id_track'].nunique().reset_index().sort_values("id_track", ascending=False)
这是一个旨在提高性能的 NumPy 方法 -
def nunique_groupby_col0_in_col1(a):
b = a[np.lexsort(a[:,::-1].T)]
m = np.r_[True, b[1:,1] != b[:-1,1]]
split_idx = np.r_[0, np.flatnonzero(b[1:,0] != b[:-1,0])+1]
m[split_idx] = 1
count = np.add.reduceat(m,split_idx)
userIDs = b[split_idx,0]
sidx = count.argsort()[::-1]
out_data = np.column_stack(( userIDs, count ))[sidx]
return out_data
样本运行-
In [69]: df
Out[69]:
id_user id_track
0 1 1
1 1 2
2 1 4
3 3 1
4 3 1
5 3 4
6 1 1
7 2 5
In [70]: out_data = nunique_groupby_col0_in_col1(df.values)
...: cnames = list(['id_user','uniqueTracks'])
...: dfout = pd.DataFrame(out_data,columns=cnames)
...:
In [71]: dfout
Out[71]:
id_user uniqueTracks
0 1 3
1 3 2
2 2 1
我想知道如何根据另一个值计算某些列中的唯一值。我的 DataFrame 如下所示:
id_user id_track
1 1
1 2
1 4
3 1
3 1
3 4
1 1
2 5
基本上我有一个 table,其中包含用户 ID 和他们收听的歌曲。我想为每个用户计算,他听了多少首独特的歌曲,并按这个值排序。输出应该是这样的:
id_user uniqueTracks
1 3
3 2
2 1
我试过这样做(hearings是我的DataFrame):
uniqueTracks=[] #list of numbers of unique tracks
for i in range(len(hearings['id_user'].unique())):
uniqueTracks.append(len(hearings[hearings['id_user']==i['titles'].unique()))
但是对于 2700 万行和 70k 独立用户的 table,它的运行速度非常慢。有谁知道如何在 Pandas 中执行此操作?提前谢谢你:)
使用 groupby.nunique()
计算每个用户的唯一值,并使用 sort_values
对结果进行排序:
df.groupby('id_user')['id_track'].nunique().sort_values(ascending=False)
#id_user
#1 3
#3 2
#2 1
#Name: id_track, dtype: int64
要以数据框的形式返回结果,reset_index
:
df.groupby('id_user')['id_track'].nunique().reset_index().sort_values("id_track", ascending=False)
这是一个旨在提高性能的 NumPy 方法 -
def nunique_groupby_col0_in_col1(a):
b = a[np.lexsort(a[:,::-1].T)]
m = np.r_[True, b[1:,1] != b[:-1,1]]
split_idx = np.r_[0, np.flatnonzero(b[1:,0] != b[:-1,0])+1]
m[split_idx] = 1
count = np.add.reduceat(m,split_idx)
userIDs = b[split_idx,0]
sidx = count.argsort()[::-1]
out_data = np.column_stack(( userIDs, count ))[sidx]
return out_data
样本运行-
In [69]: df
Out[69]:
id_user id_track
0 1 1
1 1 2
2 1 4
3 3 1
4 3 1
5 3 4
6 1 1
7 2 5
In [70]: out_data = nunique_groupby_col0_in_col1(df.values)
...: cnames = list(['id_user','uniqueTracks'])
...: dfout = pd.DataFrame(out_data,columns=cnames)
...:
In [71]: dfout
Out[71]:
id_user uniqueTracks
0 1 3
1 3 2
2 2 1