我在这里看到了几个例子,但是没有一个是重点。
我有类似
的数据 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时的美国)
所以我尝试了多个近似值,但是没有任何效果。
任何帮助将不胜感激
答案 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