结合两个不同的数据框列创建新的数据框

时间:2019-01-22 11:30:29

标签: python-3.x pandas

我有两个数据框

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

但是,这种方法花费更多时间,最终导致内存错误。 有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

使用pivotpivot_tablecrosstab

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'])