Pandas_数据合并+拆分

Merge合并语法

# 第一个表:
df_ratings = pd.read_csv(
'data/ratings.csv',
sep=',',
engine='python',
names='UserID,MovieID,Rating,Timestamp'.split(',')
)
# 第二个表:
df_users = pd.read_csv(
'data/user.csv',
sep=',',
engine='python',
names='UserID,Gender,Age,Occupation,Zip-code'.split(',')
)
# 第三个表:
df_movies = pd.read_csv(
'data/movies.dat',
sep=',',
engine='python',
names='MovieID,Title,Genres'.split(',')
)
# 1)第一个merge 两个表进行合并
df_ratings_user = pd.merge( # 两边都有的数据才会显示
df_ratings, df_users, left_on='UserID', right_on='UserID', how='inner'
)
# 2)第二个merge,将合并后的两个表和第三个表进行合并
df_ratings_users_movies = pd.merge(
df_ratings_user, df_movies,left_on = 'MovieID', right_on = 'MovieID', how = 'inner'
)
# 3)理解merge时候数量的对齐关系
# one-to-one:一对一关系,关联的key都是唯一的。结果条数:1*1
# one-to-many:一对多关系,左边唯一key,右边不唯一key。结果条数:1*N
# many-to-many:多对多关系,左边右边都不是唯一的。结果条数:M*N
# 4)one-to-one一对一关系的merge
left = pd.DataFrame({'sno': [11,12,13,14],
'name':['name_a', 'name_b','name_c', 'name_d']},
)
right = pd.DataFrame({'sno': [11,12,13,14],
'age':['21', '22','23', '24']},
)
pd.merge(left, right, on='sno')
# 5)one-to-many一对多关系的merge 注意:数据会被复制,数量以多的为准
left = pd.DataFrame({'sno': [11,12,13,14],
'name':['name_a', 'name_b','name_c', 'name_d']},
)
right = pd.DataFrame({'sno': [11,11,11,12,12,13],
'grade':['语文88', '数学90','英语76', '语文66', '数学55', '英语29']},
)
pd.merge(left, right, on='sno')
# 6)many-to-many多对多关系的merge
left = pd.DataFrame({'sno': [11,11,12,12,13,14],
'爱好':['篮球', '羽毛球','乒乓球', '篮球', '足球', '篮球']},
)
right = pd.DataFrame({'sno': [11,11,11,12,12,13],
'grade':['语文88', '数学90','英语76', '语文66', '数学55', '英语29']},
)
pd.merge(left, right, on='sno')
# 7)理解left join,right join,inner join, outer join的区别
left = pd.DataFrame({
'key':['K0', 'K1', 'K2', 'K3'],
'A':['A0','A1','A2','A3'],
'B':['B0', 'B1', 'B2', 'B3'] # left join左侧全保留 + 保留都有的部分,右面无法匹配为Null
})
right = pd.DataFrame({
'key': ['K0', 'K1', 'K4', 'K5'],
'C': ['C0', 'C1', 'C4', 'C5'], # right join右侧全保留 + 保留都有的部分,左面无法匹配为Null
'D': ['D0', 'D1', 'D4', 'D5']
})
# 8)inner join 默认
pd.merge(left, right, how='inner')
# 9)outer join左边,右边都会出现在结果中,如果无法匹配则为Null
pd.merge(left, right, how='outer')
# 10)如果出现非Key的字段相同,怎么办?
left = pd.DataFrame({
'key':['K0', 'K1', 'K2', 'K3'],
'A':['A0','A1','A2','A3'],
'B':['B0', 'B1', 'B2', 'B3']
})
right = pd.DataFrame({
'key': ['K0', 'K1', 'K4', 'K5'],
'A': ['A10', 'A11', 'A12', 'A13'],
'D': ['D0', 'D1', 'D4', 'D5']
})
pd.merge(left, right, on='key')
# key A_x B A_y D
# 0 K0 A0 B0 A10 D0
# 1 K1 A1 B1 A11 D1
pd.merge(left, right, on='key', suffixes=('_left', '_right'))
# key A_left B A_right D
# 0 K0 A0 B0 A10 D0
# 1 K1 A1 B1 A11 D1

Concat合并语法

import warnings
warnings.filterwarnings('ignore')
# 1)使用pandas.concat合并数据
# 默认的concat,参数axis=0,join=outer,ignore_index=False
pd.concat([df1, df2])
# A B C D E
# 0 A0 B0 C0 D0 NaN
# 1 A1 B1 C1 D1 NaN
# 2 A2 B2 C2 D2 NaN
# 3 A3 B3 C3 D3 NaN
# 0 A4 B4 C4 NaN E4
# 1 A5 B5 C5 NaN E5
# 2 A6 B6 C6 NaN E6
# 3 A7 B7 C7 NaN E7
# 相关的字段选项:
# 使用ignore_index=True可以忽略原来的索引
# 使用join=inner过滤掉不匹配的列
# 使用axis=1相当于添加新列
# 将Series合并到concat中:
pd.concat([df1, s1], axis=1)
# 2)添加多列Series
s2 = df1.apply(lambda s:s['A'] + '_GG', axis=1)
s2.name='G'
pd.concat([df1, s1, s2], axis=1)
# 3)Series合并
pd.concat([s1, s2], axis=1)
# 4)df s df 混合合并
pd.concat([s1, df1, s2], axis=1)
# 5)使用DataFrame.append按照行合并数据
df1 = pd.DataFrame([[1,2], [3,4]], columns=list('AB'))
df2 = pd.DataFrame([[5,6], [7,8]], columns=list('AB'))
df1.append(df2)
# 5.1)忽略原来的索引ignore_index=True,原来0,1,0,1 变为0,1,2,3
df1.append(df2, ignore_index=True)
# 5.2)以一行一行的给DataFrame添加数据
df = pd.DataFrame(columns=['A'])
# 5.2.1)低性能版本
for i in range(5):
df = df.append({'A':i}, ignore_index=True) # 注意这里每次都在复制
# 5.2.2)性能较好的版本
pd.concat(
[pd.DataFrame([i], columns=['A']) for i in range(5)], # 第一个入参是一个列表,避免了多次复制
ignore_index=True
)
posted @   aall_blue  阅读(495)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示