pandas-数据合并和拆分
pandas-数据合并和拆分
数据集拆分是将一个大型的数据集拆分为多个较小的数据集,可以让数据更加清晰易懂,也方便对单个数据集进行分析和处理。
同时,分开的数据集也可以分别应用不同的数据分析方法进行处理,更加高效和专业。
数据集合并则是将多个数据集合并成一个大的数据集,可以提供更全面的信息,也可以进行更综合的数据分析。
同时,数据集合并也可以减少数据处理的复杂度和时效性,提升数据分析的准确性和结果的可靠性。
数据拆分
拆分行
拆分单行和多行
import pandas as pd
df = pd.DataFrame(
{
"name": ["小红", "小明", "小华"],
"age": [13, 15, 14],
"gender": ["男", "女", "男"],
}
)
first_row = df.loc[0:0, :]
left_rows = df.loc[1,:]
拆分列
拆分单行和多行
import pandas as pd
df = pd.DataFrame(
{
"name": ["小红", "小明", "小华"],
"age": [13, 15, 14],
"gender": ["男", "女", "男"],
}
)
first_cols = df[["name"]]
left_cols = df[["age", "gender"]]
按条件拆分
import pandas as pd
df = pd.DataFrame(
{
"name": ["小红", "小明", "小华"],
"age": [13, 15, 14],
"gender": ["男", "女", "男"],
}
)
males = df[df["gender"] == "男"]
greater13 = df[df["age"] > 13]
数据合并
append
FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version.
data.append(other, ignore_index=False, verify_integrity=False, sort=False)
other 可以是一个 DataFrame,也可以是一个含有多个 DataFrame 的列表
ignore_index 是否对返回的新对象重置索引
verify_integrity 追加的所有数据中存在重复的行索引时,是否报错
sort 是否对追加后返回的新对象进行排序
merge
merge方法合并DataFrame时,有两个重要的参数:
1. how:设置合并的方式,有inner,outer,left,right四种方式。
2. on:依据那个列来合并
def merge(
left: DataFrame | Series,
right: DataFrame | Series,
how: str = "inner",
on: IndexLabel | None = None,
left_on: IndexLabel | None = None,
right_on: IndexLabel | None = None,
left_index: bool = False,
right_index: bool = False,
sort: bool = False,
suffixes: Suffixes = ("_x", "_y"),
copy: bool = True,
indicator: bool = False,
validate: str | None = None,
)-> DataFrame
left,right 用于连接的DataFrame
how merge的四种类型 分别为'inner'、'left'、'right'和'outer'
'inner'的类型称为内连接,它在拼接的过程中会取两张表的键(key)的交集
'left'和'right'的merge方式其实是类似的,分别被称为左连接和右连接。
'outer'是外连接,在拼接的过程中它会取两张表的键(key)的并集进行拼接
on 用于连接列名 必须都存在于两个DataFrame中
left_on 左侧用于连接键的列
right_on 右侧用于连接键的列
left_index 将左侧行索引作为连接键
right_index 将右侧行索引作为连接键
sort 合并后排序
suffixes 用于追加重叠列名的末尾
详细参考:https://zhuanlan.zhihu.com/p/102274476
import pandas as pd
import random
left = pd.DataFrame({'key':list('abcde'),'data1':range(5)})
right = pd.DataFrame({'key': ['a', 'b', 'd'],'data2':range(3,6)})
print('left----------------')
print(left)
print('right----------------')
print(right)
result = pd.merge(left, right)
print('merge----------------')
print(result)
left----------------
key data1
0 a 0
1 b 1
2 c 2
3 d 3
4 e 4
right----------------
key data2
0 a 3
1 b 4
2 d 5
merge----------------
key data1 data2
0 a 0 3
1 b 1 4
2 d 3 5
concat
用于指定合并的轴是行还是列,用于指定合并的轴是行还是列
pandas.concat(objs, *, axis=0, join='outer', ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False, sort=False, copy=None)
objs 必须是一个包含 DataFrame 或 Series 的列表
axis 默认为 0 ,表示纵向连接
join 合并的时候axis外的索引对其方式: ‘inner’, ‘outer’,默认outer:取并集
ignore_index 布尔值,默认为False:保留原来对象的索引值;True
keys 添加一级索引,以区分不同的合并对象
levels 构建多层索引
行合并
import pandas as pd
df1 = pd.DataFrame(
{
"name": ["xiaohong", "xiaoming"],
"age": [13, 15],
"gender": ["bog", "girl"],
}
)
df2 = pd.DataFrame(
{
"name": ["xiaohong", "xiaohua"],
"age": [13, 15],
"gender": ["boy", "girl"],
}
)
df = pd.concat([df1, df2], axis=0)
print(df)
# name age gender
#0 xiaohong 13 bog
#1 xiaoming 15 girl
#0 xiaohong 13 boy
#1 xiaohua 15 girl
# 如果数据没有则为None
df3 = pd.DataFrame(
{
"name": ["xiaohong", "xiaohua"],
"age": [13, 15],
# "gender": ["boy", "girl"],
}
)
df = pd.concat([df1, df3], axis=0)
print(df)
# name age gender
#0 xiaohong 13 bog
#1 xiaoming 15 girl
#0 xiaohong 13 NaN
#1 xiaohua 15 NaN
列合并
import pandas as pd
df1 = pd.DataFrame(
{
"name": ["beike", "haixing"],
"age": [13, 15],
"gender": ["bog", "girl"],
}
)
df2 = pd.DataFrame(
{
"score": [100, 90],
"city": ["nanjing", "beijing"],
}
)
df = pd.concat([df1, df2], axis=1)
print(df)
# name age gender score city
#0 beike 13 bog 100 nanjing
#1 haixing 15 girl 90 beijing
join
在索引或键列上与其他DataFrame连接列。通过传递列表,有效地通过索引连接多个DataFrame对象。
DataFrame.join(other, on=None, how='left', lsuffix='', rsuffix='', sort=False)
other: DataFrame,具有名称字段集的Series,或DataFrame列表 索引
on: name,tuple / names 列表或array-like调用者中的列或索引级别名称,用于连接其他索引
How:{'left','right','outer','inner'},默认:'left'
lsuffix: string 使用左框架重叠列的后缀
rsuffix: string 使用右框架重叠列的后缀
import pandas as pd
pd1 = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3', 'K4'],
'A': ['A0', 'A1', 'A2', 'A3', 'A4']})
print(pd1)
# key A
#0 K0 A0
#1 K1 A1
#2 K2 A2
#3 K3 A3
#4 K4 A4
pd2 = pd.DataFrame({'key': ['K0', 'K1', 'K2'],
'B': ['B0', 'B1', 'B2']})
print(pd2)
# key B
#0 K0 B0
#1 K1 B1
#2 K2 B2
#1.使用索引加入DataFrames
pd3=pd1.join(pd2, lsuffix='_a', rsuffix='_b')
print(caller)
# key_a A key_b B
#0 K0 A0 K0 B0
#1 K1 A1 K1 B1
#2 K2 A2 K2 B2
#3 K3 A3 NaN NaN
#4 K4 A4 NaN NaN
# 设置索引进行添加
pd4=pd1.set_index('key').join(pd2.set_index('key'))
print(pd4)
# A B
#key
#K0 A0 B0
#K1 A1 B1
#K2 A2 B2
#K3 A3 NaN
#K4 A4 NaN
# 保留原先索引
pd5=pd1.join(pd2.set_index('key'), on='key')
print(pd5)
# key A B
#0 K0 A0 B0
#1 K1 A1 B1
#2 K2 A2 B2
#3 K3 A3 NaN
#4 K4 A4 NaN
参考资料
https://www.cjavapy.com/article/599/