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/

https://mp.weixin.qq.com/s/36338fBQF6NrBQmywKHxaA

https://www.cnblogs.com/wang_yb/p/17602491.html

posted @ 2023-09-07 18:59  贝壳里的星海  阅读(242)  评论(0编辑  收藏  举报