我需要帮助将多列中的唯一值(例如列a1和a2)转换为新列,然后将列b1和b2中的值相应地分配给新创建的列。
例如,如果我有一个数据框df如下:
import pandas as pd
import numpy as np
df = pd.DataFrame({'a1':['q','w','e','r'], 'a2':['s','e','q','u'], 'b1':[1,2,3,4], 'b2':[5,6,7,8],})
print(df)
a1 a2 b1 b2 0 q s 1 5 1 w e 2 6 2 e q 3 7 3 r u 4 8
列a1和a2的唯一值是['e','q','r','s','u','w']。
np.unique(df.loc[:,['a1','a2']].values)
array(['e', 'q', 'r', 's', 'u', 'w'], dtype=object)
我想将df转换为新的数据框df1,如下所示:
print(df1)
e q r s u w 0 0 1 0 5 0 0 1 6 0 0 0 0 2 2 3 7 0 0 0 0 3 0 0 4 0 8 0
请注意,'q'和's'出现在df的第一行中,因此1(从列b1开始)和5(从列b2)分配给数据帧df1的q和s列,而其他列为0。
我可以在R中使用融合和dcast函数来实现这一点,但是我不知道如何在Python中实现它。
谢谢。
import pandas as pd
df = pd.DataFrame({'a1':['q','w','e','r'], 'a2':['s','e','q','u'], 'b1':[1,2,3,4], 'b2':[5,6,7,8],})
pd.DataFrame.from_dict([dict(zip(df.iloc[t,:2] , df.iloc[t,2:])) for t in range(len(df))]).fillna(0).astype(int)
e q r s u w
0 0 1 0 5 0 0
1 6 0 0 0 0 2
2 3 7 0 0 0 0
3 0 0 4 0 8 0