我有两个数据框
df1#-它具有用户ID和相应用户购买的产品。
Userid, Productid, Ordered_Qty
user1 1 1
user1 2 1
user1 3 1
user2 4 1
user2 5 1
user2 3 1
user3 2 1
user3 4 1
user3 5 1
df2#-该产品具有产品主版本
Productid, some_attribute
1 "xsff"
2 "xsff"
3 "xsff"
4 "xsff"
5 "xsff"
现在,我想创建一个如下所示的新数据框,
Row - Userid from df1
columns - Productid from df2
新数据框#-[i,j]值对应于df1#Ordered_Qty(任意数量)。基本上我想拥有df2-Productid中的所有值,但将值填充到新数据框中 来自df1。如果df1没有userid(row)和product(col)组合的条目,那么我想将其保留为零
1 2 3 4 5
user1 1 1 1 0 0
user2 0 0 1 1 1
user3 0 1 0 1 1
要实现这一目标,我要做的是
new_dataframe = pd.dataframe(0,index=df1.Userid.unique(),columns=df2.Productid.unique())
for index,row in df1.iterrows():
userid = row['Userid']
productid = row['Productid']
ord_qty = row['Ordered_Qty']
new_dataframe.loc[userid][productid] = ord_qty
但是,这种方法花费更多时间,最终导致内存错误。 有更好的方法吗?
答案 0 :(得分:1)
使用pivot
或pivot_table
或crosstab
:
df3 = df.pivot(index='Userid', columns='Productid').fillna(0, downcast='infer')
df3.columns = df3.columns.get_level_values(1)
或者:
df3 = df.pivot_table(index='Userid', columns='Productid', fill_value=0)
df3.columns = df3.columns.get_level_values(1)
或者:
df3 = pd.crosstab(df['Userid'], df['Productid'])
然后:
df3 = df3.reindex(columns=df2.Productid.unique(), fill_value=0)
答案 1 :(得分:1)
请使用交叉表:
pandas.crosstab(df['userid'], df['productid'])