pandas 例子

记录下,清洗数据时,碰到的一些操作。

笛卡尔积

问题1

假设我我们有如下数据表1,需要根据数据表1,生成数据表2,应该如何生成呢?
解释:根据表1 中的 user_iditem_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
# 生成表1
data = {'user_id': [1, 2, 3], 'item_id': [1, 2, 3], 'label': [1, 1, 1]}
df1 = pd.DataFrame(data)
print(df1)
# 以c为键,利用merge构建笛卡尔积
df2 = pd.merge(df1[['user_id', 'label']], df1[['item_id', 'label']], on='label')
# 将'c'列设为全0
df2['label'] = 0
print(df2)
# 将 df2 与df1 进行拼接, 利用 drop_duplicates 将 'a' 'b' 组合重复的行去掉
df3 = pd.concat([df1, df2]).drop_duplicates(subset=['user_id', 'item_id'], keep=False, ignore_index=True)
print(df3)
# 再将 df1 与 df3 进行合并, 即为所求 表2。
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