相思本是无凭语,

莫向花牋费泪行。

hanstary

相思本是无凭语,莫向花牋费泪行。

Pandas数据处理

Pandas数据处理

1.操作行名和列名

(1)设置某一列为行名

df.set_index(列名,drop=布尔值)
# drop表示是否删除这一列
import pandas as pd

data = [
    ["0001", '苹果', 5, '山东'],
    ["0002", '香蕉', 3, '海南'],
    ["0003", '橙子', 6, '江西'],
    ["0004", '西瓜', 2, '新疆'],
    ["0005", '草莓', 10, '辽宁'],
    ["0006", '葡萄', 8, '云南'],
    ["0007", '芒果', 7, '广西'],
    ["0008", '菠萝', 4, '广东'],
    ["0009", '梨', 4, '河北'],
    ["0010", '桃子', 5, '四川']
]
df = pd.DataFrame(data, columns=["编号", "水果", "价格", "产地"])
df = df.set_index("编号", drop=True)
print(df)

(2)重置行名

df.reset_index(drop=布尔值)
import pandas as pd

data = [
    ["0001", '苹果', 5, '山东'],
    ["0002", '香蕉', 3, '海南'],
    ["0003", '橙子', 6, '江西'],
    ["0004", '西瓜', 2, '新疆'],
    ["0005", '草莓', 10, '辽宁'],
    ["0006", '葡萄', 8, '云南'],
    ["0007", '芒果', 7, '广西'],
    ["0008", '菠萝', 4, '广东'],
    ["0009", '梨', 4, '河北'],
    ["0010", '桃子', 5, '四川']
]
df = pd.DataFrame(data, columns=["编号", "水果", "价格", "产地"])
df = df.sample(5)
df=df.reset_index(drop=False)
print(df)

(3)修改行名和列名

df.index=列表
df.columns=列表
df.rename(index=字典,columns=字典)
import pandas as pd

data = [
    ["0001", '苹果', 5, '山东'],
    ["0002", '香蕉', 3, '海南'],
    ["0003", '橙子', 6, '江西'],
    ["0004", '西瓜', 2, '新疆'],
    ["0005", '草莓', 10, '辽宁'],
    ["0006", '葡萄', 8, '云南'],
    ["0007", '芒果', 7, '广西'],
    ["0008", '菠萝', 4, '广东'],
    ["0009", '梨', 4, '河北'],
    ["0010", '桃子', 5, '四川']
]
df = pd.DataFrame(data, columns=["编号", "水果", "价格", "产地"])
df.columns = ["id", "fruit", "price", "producer"]
df = df.rename(
    index={0: "000", 1: "001", 2: "002", 3: "003", 4: "004", 5: "005", 6: "006", 7: "007", 8: "008", 9: "009",
           10: "010"})
print(df)

2.类型转换

(1)转换为字典

df.to_dict()
import pandas as pd

data = [
    ["0001", '苹果', 5, '山东'],
    ["0002", '香蕉', 3, '海南'],
    ["0003", '橙子', 6, '江西'],
    ["0004", '西瓜', 2, '新疆'],
    ["0005", '草莓', 10, '辽宁'],
    ["0006", '葡萄', 8, '云南'],
    ["0007", '芒果', 7, '广西'],
    ["0008", '菠萝', 4, '广东'],
    ["0009", '梨', 4, '河北'],
    ["0010", '桃子', 5, '四川']
]
df = pd.DataFrame(data, columns=["编号", "水果", "价格", "产地"])
dic = df.to_dict()
print(dic)
print(type(dic))

(2)转换为数组

np.array(df)
import numpy as np
import pandas as pd

data = [
    ["0001", '苹果', 5, '山东'],
    ["0002", '香蕉', 3, '海南'],
    ["0003", '橙子', 6, '江西'],
    ["0004", '西瓜', 2, '新疆'],
    ["0005", '草莓', 10, '辽宁'],
    ["0006", '葡萄', 8, '云南'],
    ["0007", '芒果', 7, '广西'],
    ["0008", '菠萝', 4, '广东'],
    ["0009", '梨', 4, '河北'],
    ["0010", '桃子', 5, '四川']
]
df = pd.DataFrame(data, columns=["编号", "水果", "价格", "产地"])
arr = np.array(df)
print(arr)
print(type(arr))

(3)转换为列表

先将DataFrame转换为数组,再将数组转换为列表

import numpy as np
import pandas as pd

data = [
    ["0001", '苹果', 5, '山东'],
    ["0002", '香蕉', 3, '海南'],
    ["0003", '橙子', 6, '江西'],
    ["0004", '西瓜', 2, '新疆'],
    ["0005", '草莓', 10, '辽宁'],
    ["0006", '葡萄', 8, '云南'],
    ["0007", '芒果', 7, '广西'],
    ["0008", '菠萝', 4, '广东'],
    ["0009", '梨', 4, '河北'],
    ["0010", '桃子', 5, '四川']
]
df = pd.DataFrame(data, columns=["编号", "水果", "价格", "产地"])
arr = np.array(df)
lis = arr.tolist()
print(lis)
print(type(lis))

(4)针对某一列转换

df[列名].astype(类型)
import pandas as pd

data = [
    ["0001", '苹果', 5, '山东'],
    ["0002", '香蕉', 3, '海南'],
    ["0003", '橙子', 6, '江西'],
    ["0004", '西瓜', 2, '新疆'],
    ["0005", '草莓', 10, '辽宁'],
    ["0006", '葡萄', 8, '云南'],
    ["0007", '芒果', 7, '广西'],
    ["0008", '菠萝', 4, '广东'],
    ["0009", '梨', 4, '河北'],
    ["0010", '桃子', 5, '四川']
]
df = pd.DataFrame(data, columns=["编号", "水果", "价格", "产地"])
df["价格"] = df["价格"].astype(float)
print(df)

3.行列转置

df.T
import pandas as pd

data = [
    ["0001", '苹果', 5, '山东'],
    ["0002", '香蕉', 3, '海南'],
    ["0003", '橙子', 6, '江西'],
    ["0004", '西瓜', 2, '新疆'],
    ["0005", '草莓', 10, '辽宁'],
    ["0006", '葡萄', 8, '云南'],
    ["0007", '芒果', 7, '广西'],
    ["0008", '菠萝', 4, '广东'],
    ["0009", '梨', 4, '河北'],
    ["0010", '桃子', 5, '四川']
]
df = pd.DataFrame(data, columns=["编号", "水果", "价格", "产地"])
df = df.T
print(df)

4.大小排序

df.sort_values(by=列表,ascending=布尔值)
# ascending 设置升序或降序,True为升序,False为降序,默认为升序
import pandas as pd

data = [
    ["0001", '苹果', 5, '山东'],
    ["0002", '香蕉', 3, '海南'],
    ["0003", '橙子', 6, '江西'],
    ["0004", '西瓜', 2, '新疆'],
    ["0005", '草莓', 10, '辽宁'],
    ["0006", '葡萄', 8, '云南'],
    ["0007", '芒果', 7, '广西'],
    ["0008", '菠萝', 4, '广东'],
    ["0009", '梨', 4, '河北'],
    ["0010", '桃子', 5, '四川']
]
df = pd.DataFrame(data, columns=["编号", "水果", "价格", "产地"])
df = df.sort_values(by=["价格"], ascending=True)
print(df)

5.数据排名

df[列名].rank(ascending=布尔值,method=值)

method排序值如下

取值 说明
average 平均值排名(默认值)
max 最大值排名
min 最小值排名
first 按值在原始数据中出现的顺序进行排名
import pandas as pd

data = [
    ["0001", '苹果', 5, '山东'],
    ["0002", '香蕉', 3, '海南'],
    ["0003", '橙子', 6, '江西'],
    ["0004", '西瓜', 2, '新疆'],
    ["0005", '草莓', 10, '辽宁'],
    ["0006", '葡萄', 8, '云南'],
    ["0007", '芒果', 7, '广西'],
    ["0008", '菠萝', 4, '广东'],
    ["0009", '梨', 4, '河北'],
    ["0010", '桃子', 5, '四川']
]
df = pd.DataFrame(data, columns=["编号", "水果", "价格", "产地"])
df["排名"] = df["价格"].rank(ascending=False, method="max")
print(df)

6.数据替换

df.replace(字典)
import pandas as pd

data = [
    ["0001", '苹果', 5, '山东'],
    ["0002", '香蕉', 3, '海南'],
    ["0003", '橙子', 6, '江西'],
    ["0004", '西瓜', 2, '新疆'],
    ["0005", '草莓', 10, '辽宁'],
    ["0006", '葡萄', 8, '云南'],
    ["0007", '芒果', 7, '广西'],
    ["0008", '菠萝', 4, '广东'],
    ["0009", '梨', 4, '河北'],
    ["0010", '桃子', 5, '四川']
]
df = pd.DataFrame(data, columns=["编号", "水果", "价格", "产地"])
df = df.replace({4: 6})
print(df)

7.数据移动

df.shift(n)
# n为正数,是向后移动,n为负数,是向前移动
import pandas as pd

data = [
    ["0001", '苹果', 5, '山东'],
    ["0002", '香蕉', 3, '海南'],
    ["0003", '橙子', 6, '江西'],
    ["0004", '西瓜', 2, '新疆'],
    ["0005", '草莓', 10, '辽宁'],
    ["0006", '葡萄', 8, '云南'],
    ["0007", '芒果', 7, '广西'],
    ["0008", '菠萝', 4, '广东'],
    ["0009", '梨', 4, '河北'],
    ["0010", '桃子', 5, '四川'],
    ["0011", None, None, None],
]
df = pd.DataFrame(data, columns=["编号", "水果", "价格", "产地"])
df = df.shift(1)
print(df)

8.数据清洗

(1)缺失值

A.判断缺失值

df.isnull()
import pandas as pd

data = [
    ["0001", '苹果', 5, '山东'],
    ["0002", '香蕉', 3, '海南'],
    ["0003", '橙子', 6, '江西'],
    ["0004", '西瓜', 2, '新疆'],
    ["0005", '草莓', 10, '辽宁'],
    ["0006", '葡萄', 8, '云南'],
    ["0007", None, 7, '广西'],
    ["0008", '菠萝', 4, '广东'],
    ["0009", '梨', 4, '河北'],
    ["0010", '桃子', 5, '四川'],
    ["0011", None, None, None],
]
df = pd.DataFrame(data, columns=["编号", "水果", "价格", "产地"])
res = df.isnull()
print(res)

B.删除缺失值

df.dropna(axis=0或1,how="any"或"all")
# any:当这一行有任意一个空白,那就删除这行
# all:当这一行全都是空白,才将这一行删除
import pandas as pd

data = [
    ["0001", '苹果', 5, '山东'],
    ["0002", '香蕉', 3, '海南'],
    ["0003", '橙子', 6, '江西'],
    ["0004", '西瓜', 2, '新疆'],
    ["0005", '草莓', 10, '辽宁'],
    ["0006", '葡萄', 8, '云南'],
    ["0007", None, 7, '广西'],
    ["0008", '菠萝', 4, '广东'],
    ["0009", '梨', 4, '河北'],
    ["0010", '桃子', 5, '四川'],
    ["0011", None, None, None],
]
df = pd.DataFrame(data, columns=["编号", "水果", "价格", "产地"])
df = df.dropna(axis=0, how="any")
print(df)

C.填充缺失值

df.fillna(value=字典,method=填充方式)

method的值如下

取值 说明
ffill 使用前值填充
bfill 使用后值填充
import pandas as pd

data = [
    ["0001", '苹果', 5, '山东'],
    ["0002", '香蕉', 3, '海南'],
    ["0003", '橙子', 6, '江西'],
    ["0004", '西瓜', 2, '新疆'],
    ["0005", '草莓', 10, '辽宁'],
    ["0006", '葡萄', 8, '云南'],
    ["0007", None, 7, '广西'],
    ["0008", '菠萝', 4, '广东'],
    ["0009", '梨', 4, '河北'],
    ["0010", '桃子', 5, '四川'],
    ["0011", None, None, None],
]
df = pd.DataFrame(data, columns=["编号", "水果", "价格", "产地"])
df = df.fillna(value={"水果": "椰子"})
print(df)

(2)重复值

A.判断重复值

df.duplicated()
import pandas as pd

data = [
    ["0001", '苹果', 5, '山东'],
    ["0002", '香蕉', 3, '海南'],
    ["0003", '橙子', 6, '江西'],
    ["0004", '西瓜', 2, '新疆'],
    ["0005", '草莓', 10, '辽宁'],
    ["0006", '葡萄', 8, '云南'],
    ["0007", '菠萝', 7, '广西'],
    ["0008", '菠萝', 4, '广东'],
    ["0009", '梨', 4, '河北'],
    ["0010", '桃子', 5, '四川'],
    ["0010", '桃子', 5, '四川']
]
df = pd.DataFrame(data, columns=["编号", "水果", "价格", "产地"])
res = df.duplicated()
print(res)

B.删除重复值

df.drop_duplicates(subset=列表,keep=值)
# subset用于指定对那些列进行判断

keep的取值如下

取值 说明
first 保留第一次出现的重复行,删除后面的重复行(默认值)
last 保留最后一次出现的重复行,删除其他的重复行
False 删除所以的重复行
import pandas as pd

data = [
    ["0001", '苹果', 5, '山东'],
    ["0002", '香蕉', 3, '海南'],
    ["0003", '橙子', 6, '江西'],
    ["0004", '西瓜', 2, '新疆'],
    ["0005", '草莓', 10, '辽宁'],
    ["0006", '葡萄', 8, '云南'],
    ["0007", '菠萝', 7, '广西'],
    ["0008", '菠萝', 4, '广东'],
    ["0009", '梨', 4, '河北'],
    ["0010", '桃子', 5, '四川'],
    ["0010", '桃子', 5, '四川']
]
df = pd.DataFrame(data, columns=["编号", "水果", "价格", "产地"])
df = df.drop_duplicates(subset="水果",keep="first")
print(df)

9.数据合并

方法 说明
concat() 轴向合并
merge() 主键合并
join() 行列连接
append() 纵向合并

(1)concat()

pd.concat(列表,axis=0或1,join=连接方式,ignore_index=布尔值)

A.axis

axis用于设置维度,0表示沿纵轴,1表示沿横轴

import pandas as pd

data1 = [
    ["0001", '苹果', 5, '山东'],
    ["0002", '香蕉', 3, '海南'],
    ["0003", '橙子', 6, '江西'],
    ["0004", '西瓜', 2, '新疆'],
    ["0005", '草莓', 10, '辽宁']
]
data2 = [
    ["0006", '葡萄', 8, '云南'],
    ["0007", '芒果', 7, '广西'],
    ["0008", '菠萝', 4, '广东'],
    ["0009", '梨', 4, '河北'],
    ["0010", '桃子', 5, '四川']
]
df1 = pd.DataFrame(data1, columns=["编号", "水果", "价格", "产地"])
df2 = pd.DataFrame(data2, columns=["编号", "水果", "价格", "产地"])
res1 = pd.concat([df1, df2], axis=0, ignore_index=True)
res2 = pd.concat([df1, df2], axis=1, ignore_index=True)
print(res1)
print("=======================")
print(res2)

B.ignore_index

忽略索引则会忽略两个表格原来的索引,合并数据并重新编排数据

import pandas as pd

data1 = [
    ["0001", '苹果', 5, '山东'],
    ["0002", '香蕉', 3, '海南'],
    ["0003", '橙子', 6, '江西'],
    ["0004", '西瓜', 2, '新疆'],
    ["0005", '草莓', 10, '辽宁']
]
data2 = [
    ["0006", '葡萄', 8, '云南'],
    ["0007", '芒果', 7, '广西'],
    ["0008", '菠萝', 4, '广东'],
    ["0009", '梨', 4, '河北'],
    ["0010", '桃子', 5, '四川']
]
df1 = pd.DataFrame(data1, columns=["编号", "水果", "价格", "产地"])
df2 = pd.DataFrame(data2, columns=["编号", "水果", "价格", "产地"])
res1 = pd.concat([df1, df2], axis=0, ignore_index=True)
res2 = pd.concat([df1, df2], axis=0, ignore_index=False)
print(res1)
print("=======================")
print(res2)

C.join

连接方式用如下两种

连接方式 说明
outer 外连接(默认值)
inner 内连接
import pandas as pd

data1 = [
    ["0001", '苹果', 5, '山东', "秋季"],
    ["0002", '香蕉', 3, '海南', "夏季"],
    ["0003", '橙子', 6, '江西', "秋季"],
    ["0004", '西瓜', 2, '新疆', "夏季"],
    ["0005", '草莓', 10, '辽宁', "春季"]
]
data2 = [
    ["0006", '葡萄', 8, '云南'],
    ["0007", '芒果', 7, '广西'],
    ["0008", '菠萝', 4, '广东'],
    ["0009", '梨', 4, '河北'],
    ["0010", '桃子', 5, '四川']
]
df1 = pd.DataFrame(data1, columns=["编号", "水果", "价格", "产地", "季节"])
df2 = pd.DataFrame(data2, columns=["编号", "水果", "价格", "产地"])
res1 = pd.concat([df1, df2], axis=0, join="outer", ignore_index=True)
res2 = pd.concat([df1, df2], axis=0, join="inner", ignore_index=True)
print(res1)
print("=======================")
print(res2)

(2)merge()

pd.merge(df1,df2,how=连接方式)

how的取值如下

取值 说明
inner 内连接,求交集(默认值)
outer 外连接,求并集
left 左连接
right 右连接

A.内连接和外连接

import pandas as pd

data1 = [
    ["0001", '苹果', 5, '山东', "秋季"],
    ["0002", '香蕉', 3, '海南', "夏季"],
    ["0003", '橙子', 6, '江西', "秋季"],
    ["0004", '西瓜', 2, '新疆', "夏季"],
    ["0005", '草莓', 10, '辽宁', "春季"]
]
data2 = [
    ["0006", '葡萄', 8, '云南', '紫色'],
    ["0007", '芒果', 7, '广西', '黄色'],
    ["0008", '菠萝', 4, '广东', '黄色'],
    ["0009", '梨', 4, '河北', '黄色'],
    ["0010", '桃子', 5, '四川', '粉色']
]
df1 = pd.DataFrame(data1, columns=["编号", "水果", "价格", "产地", "季节"])
df2 = pd.DataFrame(data2, columns=["编号", "水果", "价格", "产地", "色泽"])
res1 = pd.merge(df1, df2, how="inner")
res2 = pd.merge(df1, df2, how="outer")
print(res1)
print("=======================")
print(res2)

因为df1和df2没有相同的一行,所以是空白的

B.左连接和右连接

import pandas as pd

data1 = [
    ["0001", '苹果', 5, '山东', "秋季"],
    ["0002", '香蕉', 3, '海南', "夏季"],
    ["0003", '橙子', 6, '江西', "秋季"],
    ["0004", '西瓜', 2, '新疆', "夏季"],
    ["0005", '草莓', 10, '辽宁', "春季"]
]
data2 = [
    ["0006", '葡萄', 8, '云南', '紫色'],
    ["0007", '芒果', 7, '广西', '黄色'],
    ["0008", '菠萝', 4, '广东', '黄色'],
    ["0009", '梨', 4, '河北', '黄色'],
    ["0010", '桃子', 5, '四川', '粉色']
]
df1 = pd.DataFrame(data1, columns=["编号", "水果", "价格", "产地", "季节"])
df2 = pd.DataFrame(data2, columns=["编号", "水果", "价格", "产地", "色泽"])
res1 = pd.merge(df1, df2, how="left")
res2 = pd.merge(df1, df2, how="right")
print(res1)
print("=======================")
print(res2)

left就会以df1为主,没有的数据会空着,right与之相反

(3)join()

df1.join(df2,on=行名或列名)
import pandas as pd

data1 = [
    ["0001", '苹果', 5, '山东', "秋季"],
    ["0002", '香蕉', 3, '海南', "夏季"],
    ["0003", '橙子', 6, '江西', "秋季"],
    ["0004", '西瓜', 2, '新疆', "夏季"],
    ["0005", '草莓', 10, '辽宁', "春季"]
]
data2 = [
    ["0006", '葡萄', 8, '云南', '紫色'],
    ["0007", '芒果', 7, '广西', '黄色'],
    ["0008", '菠萝', 4, '广东', '黄色'],
    ["0009", '梨', 4, '河北', '黄色'],
    ["0010", '桃子', 5, '四川', '粉色']
]
df1 = pd.DataFrame(data1, columns=["编号", "水果", "价格", "产地", "季节"]).set_index(["编号", "水果", "价格", "产地"])
df2 = pd.DataFrame(data2, columns=["编号", "水果", "价格", "产地", "色泽"]).set_index(["编号", "水果", "价格", "产地"])
res = df1.join(df2)
print(res)

(4)append()

df1._append(df2,ignore_index=布尔值)
import pandas as pd

data1 = [
    ["0001", '苹果', 5, '山东', "秋季"],
    ["0002", '香蕉', 3, '海南', "夏季"],
    ["0003", '橙子', 6, '江西', "秋季"],
    ["0004", '西瓜', 2, '新疆', "夏季"],
    ["0005", '草莓', 10, '辽宁', "春季"]
]
data2 = [
    ["0006", '葡萄', 8, '云南', '紫色'],
    ["0007", '芒果', 7, '广西', '黄色'],
    ["0008", '菠萝', 4, '广东', '黄色'],
    ["0009", '梨', 4, '河北', '黄色'],
    ["0010", '桃子', 5, '四川', '粉色']
]
df1 = pd.DataFrame(data1, columns=["编号", "水果", "价格", "产地", "季节"])
df2 = pd.DataFrame(data2, columns=["编号", "水果", "价格", "产地", "色泽"])
res = df1._append(df2, ignore_index=True)
print(res)

10.字符串处理

方法 说明
len() 获得长度
count() 统计次数
strip() 去除空格
split() 分割字符串
replace() 替换字符串
repeat() 重复字符串
cat() 连接列
lower() 大写字母转小写字母
upper() 小写字母转大写字母
swapcase() 小写字母转大写字母,并且大写字母转换为小写字母
contains() 判断是否包含某子字符串
startswith() 判断是否以某子字符串开头
endswith() 判断是否以某子字符串结尾
isnumeric() 判断所有字符是否为纯数字
islower() 判断所有字符是否为纯小写
isupper() 判断所以字符是否为纯大写

这些方法针对Series

Series.str.方法名()

posted on 2024-07-03 14:44  hanstary  阅读(1)  评论(0编辑  收藏  举报

导航