如何将Pandas数据帧转换成稀疏矩阵?

2024-04-26 05:48:19 发布

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

我在这里看到了几个例子,但都不是重点。在

我有一个数据

  countries:    usa    uk    germany   india    russia
   user :       aaa    bbb    ccc       ddd      eee
   visit:        50    20     9         30        58

所以,我想把这个df转换成一个稀疏的martix,如下所示:

^{pr2}$

另外,也有用户访问多个国家的情况(例如zzz-5次俄罗斯和4次美国)

所以我试过多个近似值,但是没有一个能正常工作。在

任何帮助都将不胜感激


Tags: 数据重点countries例子bbbcccukddd
2条回答

这是一个有趣的格式数据即将到来,所以我需要先做一些转换。在

d = ['countries','user','visit']
e = ['usa','aaa',50]
f= ['uk','bbb',20]
g = ['germany','ccc',9]
h = ['india','ddd',30]
i = ['russia','eee',58]
df1 = pd.DataFrame({0:d,1:e,2:f,3:g,4:h,5:i})
           0    1    2        3      4       5
0  countries  usa   uk  germany  india  russia
1       user  aaa  bbb      ccc    ddd     eee
2      visit   50   20        9     30      58

以上类似于您的起始格式。在接下来的步骤中,我用国家名称替换列,删除第一行(原来是国家名称),并将索引设置为第一列。在

^{pr2}$

Unstack是它开始与我们习惯的数据帧相似的地方。两次拆封给我们记录格式。Reset_index提供了一些可以透视的内容,而{}则为我们提供了格式。然后将数据帧转换为稀疏数据帧。在

df1 = df1.unstack().unstack()
df1.reset_index(inplace=True)
df1 = df1.pivot(index = 'index',columns = 'user', values = 'visit')
dfs = df1.to_sparse(fill_value = 0)

dfs
user     aaa  bbb  ccc  ddd  eee
index
germany    0    0    9    0    0
india      0    0    0   30    0
russia     0    0    0    0   58
uk         0   20    0    0    0
usa       50    0    0    0    0

dfs.density
0.2

简而言之,你不应该这样做。最好避免数据帧的行名。您应该将“country”、“user”和“visit count”设置为列,并为每个tuple添加一个观察值:

country, user, visit
usa    , aaa , x1
uk     , bbb , x2

那么,如果您想知道用户u在数据帧df中访问过c国多次: 航向位置[(df['user']==u)&;(df['country']==c),'访问'].iloc[0]

相关问题 更多 >