记录下,清洗数据时,碰到的一些操作。
笛卡尔积
问题1
假设我我们有如下数据表1,需要根据数据表1,生成数据表2,应该如何生成呢?
解释:根据表1 中的 user_id 与 item_id 进行两两组合,将未出现在表1中的组合的label 设为0,并与表1进行合并。(与表2内容一样即可,不要求顺序相同。)
表1:
| user_id |
item_id |
label |
| 1 |
1 |
1 |
| 2 |
2 |
1 |
| 3 |
3 |
1 |
表2:
| user_id |
item_id |
label |
| 1 |
1 |
1 |
| 2 |
2 |
1 |
| 3 |
3 |
1 |
| 1 |
2 |
0 |
| 1 |
3 |
0 |
| 2 |
1 |
0 |
| 2 |
3 |
0 |
| 3 |
1 |
0 |
| 3 |
2 |
0 |
要解决这一问题,我们就需要用到笛卡尔积了,具体的代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| import pandas as pd
data = {'user_id': [1, 2, 3], 'item_id': [1, 2, 3], 'label': [1, 1, 1]} df1 = pd.DataFrame(data) print(df1)
df2 = pd.merge(df1[['user_id', 'label']], df1[['item_id', 'label']], on='label')
df2['label'] = 0 print(df2)
df3 = pd.concat([df1, df2]).drop_duplicates(subset=['user_id', 'item_id'], keep=False, ignore_index=True) print(df3)
df = pd.concat([df1, df3], ignore_index=True) print(df)
|
out:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| df1: user_id item_id label 0 1 1 1 1 2 2 1 2 3 3 1
df2: user_id label item_id 0 1 0 1 1 1 0 2 2 1 0 3 3 2 0 1 4 2 0 2 5 2 0 3 6 3 0 1 7 3 0 2 8 3 0 3
df3: user_id item_id label 0 1 2 0 1 1 3 0 2 2 1 0 3 2 3 0 4 3 1 0 5 3 2 0
df: user_id item_id label 0 1 1 1 1 2 2 1 2 3 3 1 3 1 2 0 4 1 3 0 5 2 1 0 6 2 3 0 7 3 1 0 8 3 2 0
|
问题2
根据label1,label2,两个标签进行两两配对组合,并在原表生成新的label.
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| import pandas as pd data = {'label1':['a','b','c','a'],'label2':[1,2,1,3],'x':[1,2,3,4]} df = pd.DataFrame(data) print(df) # 利用笛卡尔积 生成新的组合label (前提,label1,与label2的全集 均在data中) df['k']=1 # 设置 笛卡尔积 merge点 df_label = pd.merge(df[['label1','k']].drop_duplicates(), df[['label2', 'k']].drop_duplicates(), on='k').drop('k',1).reindex() print(df_label) # 打印出 新生产组合label # 将label 利用index进行编号 df_label['label'] = df_label.index # 将label合并进原表 df = df.drop('k',1) df = df.merge(df_label,on=['label1','label2']) print(df)
|
out:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| 原表 label1 label2 x 0 a 1 1 1 b 2 2 2 c 1 3 3 a 3 4
生成的组合label表 label1 label2 label 0 a 1 0 1 a 2 1 2 a 3 2 3 b 1 3 4 b 2 4 5 b 3 5 6 c 1 6 7 c 2 7 8 c 3 8
合并后的新表 label1 label2 x label 0 a 1 1 0 1 b 2 2 4 2 c 1 3 6 3 a 3 4 2
|