如何将熊猫数据框转换为稀疏矩阵?

时间:2018-07-17 14:37:01

标签: python python-3.x pandas dataframe

我在这里看到了几个例子,但是没有一个是重点。

我有类似

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

因此,我想将此df转换为如下所示的稀疏martix:

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

P.S,有时还会有用户访问多个国家/地区(例如zzz-5时的俄罗斯和4时的美国)

所以我尝试了多个近似值,但是没有任何效果。

任何帮助将不胜感激

2 个答案:

答案 0 :(得分:1)

简而言之,您不应该这样做。最好避免使用数据帧的行名。您应该将“国家/地区”,“用户”和“访问次数”设置为列,并为每个连音添加观察值:

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

然后,如果您想知道用户u在数据框df中访问过国家c的次数,请执行以下操作:     df.loc [(df ['user'] == u)&(df ['country'] == c),'visit']。iloc [0]

答案 1 :(得分:0)

这是一种有趣的数据格式,因此我需要先进行一些转换。

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

以上类似于您的起始格式。在下一步中,我将列替换为国家/地区名称,删除第一行(最初是国家/地区名称),然后将索引设置为第一列。

df1.columns = df1.iloc[0].values
df1.drop(0, inplace=True)
df1.set_index('countries', inplace=True)
df1
           usa   uk germany india russia
countries
user       aaa  bbb     ccc   ddd    eee
visit       50   20       9    30     58

Unstack就像我们以前使用的数据框一样。两次堆叠使我们得到记录格式。 Reset_index提供了一些基础,pivot为我们提供了格式。然后,我将数据帧转换为稀疏数据帧。

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