0

I have two dataframe

df1# - This has userid and the products bought by the corresponding user.

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# - This has product master

Productid, some_attribute
1             "xsff"
2             "xsff"                
3             "xsff"
4             "xsff" 
5             "xsff"

Now, I would like to create new dataframe that looks like below,

Row - Userid from df1
columns - Productid from df2

New dataframe# - [i,j] value corresponds to the df1# Ordered_Qty(any qty).Basically I wanted to have all the values from df2 - Productid but fill the values in new dataframe from the df1. if df1 doesn't have entry for userid(row) & product(col) combination then, I like to keep zero in it

      1 2 3 4 5
user1 1 1 1 0 0
user2 0 0 1 1 1 
user3 0 1 0 1 1

To achieve this, What I did is

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

However this way of doing taking more time and eventually resulting in memory error. Is there better way to do it?

2 Answers 2

1

Use pivot or pivot_table or crosstab:

df3 = df.pivot(index='Userid', columns='Productid').fillna(0, downcast='infer')
df3.columns = df3.columns.get_level_values(1)

Or:

df3 = df.pivot_table(index='Userid', columns='Productid', fill_value=0)
df3.columns = df3.columns.get_level_values(1)

Or:

df3 = pd.crosstab(df['Userid'], df['Productid'])

And then:

df3 = df3.reindex(columns=df2.Productid.unique(), fill_value=0)
Sign up to request clarification or add additional context in comments.

Comments

1

Please use Crosstab:

pandas.crosstab(df['userid'], df['productid'])

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.