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,我的错