Python 如何将数据帧转换为稀疏矩阵?

Python 如何将数据帧转换为稀疏矩阵?,python,python-3.x,pandas,dataframe,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 b

我在这里看到了几个例子,但没有一个是中肯的

我有一个类似于

  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
另外,也有用户访问多个国家的情况(例如zzz-5次访问俄罗斯,4次访问美国)

所以我尝试了多次近似,但没有任何效果


任何帮助都将不胜感激

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

country, user, visit
usa    , aaa , x1
uk     , bbb , x2
然后,如果您想知道用户u在数据帧df中多次访问过国家c:
df.loc[(df['user']==u)和(df['country']==c),'visit'].iloc[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\u 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

您尝试过什么方法?我认为您应该将初始数据作为实际数据帧提供。此外,该示例还应包括您描述的角落案例,以帮助更好地理解问题。虽然这可能是最佳方法,但我认为这并不能回答OP的问题::)我同意您的看法,我只是想把未来的问题留给OP,我的错