本文仅记录了一些自己会使用到的知识,若没有帮到您,我感到很抱歉!
导入:
import pandas as pd
(1)pd.Series()中参数如下:
def __init__(
self,
data=None, # 数据,常用参数
index=None, # 索引,常用参数
dtype: Dtype | None = None, # 所存储的数据类型,常用参数
name=None,
copy: bool = False,
fastpath: bool = False,
):
(2)创建一个Series
# 1. 以数组形式创建
arr = [1, 2, 3, 41, 12]
s1 = pd.Series(arr, index=['a', 'b', 'c', 'd', 'e'])
# 2. 以字典形式创建
temp_dict = {"name": "xiaoming", "age": 17, "sex": "男"}
s2 = pd.Series(temp_dict )
print(s1)
print(s2)
输出:
a 1
b 2
c 3
d 41
e 12
dtype: int64
name xiaoming
age 17
sex 男
dtype: object
(3)修改数据类型
print(s1.astype("float"))
输出:
a 1.0
b 2.0
c 3.0
d 41.0
e 12.0
dtype: float64
数据如下(1-4):
s1 = pd.Series({"name": "xiaoming", "age": 17, "sex": "男", "phone": "10086"})
print(s1)
输出:
name xiaoming
age 17
sex 男
phone 10086
dtype: object
(1)获取键和值
print(s1.index)
print(s1.values)
输出:
Index(['name', 'age', 'sex', 'phone'], dtype='object')
['xiaoming' 17 '男' '10086']
(2)通过键或者索引取值
print(s1["age"]) # 取age的值
print(s1[1]) # 取第二个数据,即age的值
输出:
17
17
(3)取连续的多行
print(s1[2:])
输出:
sex 男
phone 10086
dtype: object
(4)取不连续的多行
print(s1[[2, 0]])
print(s1[["age", "name"]])
输出:
sex 男
name xiaoming
dtype: object
age 17
name xiaoming
dtype: object
(5)布尔索引
数据如下:
data = pd.Series([1, 5, 4, 12, 8, 6, 35])
print(data[data < 10])
输出:
0 1
1 5
2 4
4 8
5 6
dtype: int64
(1)pd.DataFrame()中参数如下:
def __init__(
self,
data=None, # 数据
index: Axes | None = None, # 行索引, 常用参数
columns: Axes | None = None, # 列索引, 常用参数
dtype: Dtype | None = None, # 所存储的数据类型, 常用参数
copy: bool | None = None,
):
(2)创建一个DataFrame
# 1. 以数组的形式创建
arr = [[1, 2, 3, 4], [8, 7, 6, 5]]
df = pd.DataFrame(arr)
print(df)
# 2. 以字典形式创建--列
dict1 = {"name": ["xiaoming", "xiaogang"], "age": [17, 19], "tel": ["10086", "10010"]}
df1 = pd.DataFrame(dict1, index=list("ab"))
print(df1)
# 3. 以字典形式创建--行
dict2 = [{"name": "xiaoming", "age": 17, "tel": "10086"}, {"name": "xiaogang", "age": 19, "tel": "10010"}]
df2 = pd.DataFrame(dict2, index=list("ab"))
print(df2)
# 4. 读取csv文件创建
file_path = "./data3.csv"
df3 = pd.read_csv(file_path, header=None) # 默认以csv文件中第一行为列索引,如第一行为数据,将header设置为None即可
print(df3)
输出df:
0 1 2 3
0 1 2 3 4
1 8 7 6 5
输出df1:
name age tel
a xiaoming 17 10086
b xiaogang 19 10010
输出df2:
name age tel
a xiaoming 17 10086
b xiaogang 19 10010
输出df3:
0 1 2 3 4 5
0 18 262 64 71 7 0
1 19 262 64 70 7 0
2 20 262 64 70 7 0
3 21 262 64 69 7 0
数据df:
W X Y Z
a 18 71.49 7.60 996
b 19 70.26 7.56 326
c 20 70.68 7.72 521
d 21 69.31 7.69 218
e 22 66.90 7.84 448
注:以下操作均以数据df为基础,自定义索引在3:DataFrame操作那一块
(1)常规(不推荐):
>>> df[1:3] # 取连续的多行
W X Y Z
b 19 70.26 7.56 326
c 20 70.68 7.72 521
>>> df["Y"] # 取某列
a 7.60
b 7.56
c 7.72
d 7.69
e 7.84
Name: Y, dtype: float64
>>> df[["X", "Z"]] # 取不连续的多列
X Z
a 71.49 996
b 70.26 326
c 70.68 521
d 69.31 218
e 66.90 448
>>> df[1:3][["W", "Z"]] # 取多个不相邻的元素
W Z
b 19 326
c 20 521
注:常规的受限太多,不推荐使用
(2)优化:df.loc(通过标签获取行数据):
>>> df.loc["a"] # 取某行
W 18.00
X 71.49
Y 7.60
Z 996.00
Name: a, dtype: float64
>>> df.loc["a":"d"] # 取连续的多行,左右均闭
W X Y Z
a 18 71.49 7.60 996
b 19 70.26 7.56 326
c 20 70.68 7.72 521
d 21 69.31 7.69 218
>>> df.loc[["a", "c", "e"]] # 取不连续的多行
W X Y Z
a 18 71.49 7.60 996
c 20 70.68 7.72 521
e 22 66.90 7.84 448
>>> df.loc[:, "Y"] # 取某列
a 7.60
b 7.56
c 7.72
d 7.69
e 7.84
Name: Y, dtype: float64
>>> df.loc[:, "W":"Y"] # 取连续多列
W X Y
a 18 71.49 7.60
b 19 70.26 7.56
c 20 70.68 7.72
d 21 69.31 7.69
e 22 66.90 7.84
>>> df.loc[:, ["Z", "X"]] # 取不连续的多列
Z X
a 996 71.49
b 326 70.26
c 521 70.68
d 218 69.31
e 448 66.90
>>> df.loc["a", "X"] # 取一个元素
71.49
>>> df.loc["a":"c", "X":"Z"] # 取多个相邻的元素
X Y Z
a 71.49 7.60 996
b 70.26 7.56 326
c 70.68 7.72 521
>>> df.loc[["a", "c"], ["X", "Z"]] # 取多个不相邻的元素
X Z
a 71.49 996
c 70.68 521
(3)优化:df.iloc(通过位置获取行数据):
>>> df.iloc[1] # 取某行
W 19.00
X 70.26
Y 7.56
Z 326.00
Name: b, dtype: float64
>>> df.iloc[0:3] # 取连续的多行,左闭右开
W X Y Z
a 18 71.49 7.60 996
b 19 70.26 7.56 326
c 20 70.68 7.72 521
>>> df.iloc[[1, 3, 4]] # 取不连续的多行
W X Y Z
b 19 70.26 7.56 326
d 21 69.31 7.69 218
e 22 66.90 7.84 448
>>> df.iloc[:, 1] # 取某列
a 71.49
b 70.26
c 70.68
d 69.31
e 66.90
Name: X, dtype: float64
>>> df.iloc[:, 1:4] # 取连续多列
X Y Z
a 71.49 7.60 996
b 70.26 7.56 326
c 70.68 7.72 521
d 69.31 7.69 218
e 66.90 7.84 448
>>> df.iloc[:, [1, 3, 0]] # 取不连续的多列
X Z W
a 71.49 996 18
b 70.26 326 19
c 70.68 521 20
d 69.31 218 21
e 66.90 448 22
>>> df.iloc[1, 3] # 取一个元素
326
>>> df.iloc[1:4, 0:2] # 取多个相邻的元素
W X
b 19 70.26
c 20 70.68
d 21 69.31
>>> df.iloc[[1, 3, 0], [2, 0]] # 取多个不相邻的元素
Y W
b 7.56 19
d 7.69 21
a 7.60 18
(4)布尔索引
>>> df[df["Z"] > 500] # 输出Z列大于500的行
W X Y Z
a 18 71.49 7.60 996
c 20 70.68 7.72 521
>>> df[(df["Z"] > 300) & (df["Z"] < 900)] # 输出Z列大于300且小于900的行
W X Y Z
b 19 70.26 7.56 326
c 20 70.68 7.72 521
e 22 66.90 7.84 448
数据df:
0 1 2 3
0 18 71.49 7.60 996
1 19 70.26 7.56 326
2 20 70.68 7.72 521
3 21 69.31 7.69 218
4 22 66.90 7.84 448
注:以下操作均以数据df为基础
(1)自定义行列索引
df.index = list("abcde")
df.columns = list("WXYZ")
print(df)
输出df:
W X Y Z
a 18 71.49 7.60 996
b 19 70.26 7.56 326
c 20 70.68 7.72 521
d 21 69.31 7.69 218
e 22 66.90 7.84 448
(2)修改数据类型
df1 = df.astype("int")
print(df1)
输出df1:
0 1 2 3
0 18 71 7 996
1 19 70 7 326
2 20 70 7 521
3 21 69 7 218
4 22 66 7 448
(3)按某列进行排序
df2 = df.sort_values(by=3) # 按3列进行排序
print(df2)
输出df2:
0 1 2 3
3 21 69.31 7.69 218
1 19 70.26 7.56 326
4 22 66.90 7.84 448
2 20 70.68 7.72 521
0 18 71.49 7.60 996
注:sort_values参数默认值如下:
def sort_values( # type: ignore[override]
self,
by,
axis: Axis = 0,
ascending=True,
inplace: bool = False,
kind: str = "quicksort",
na_position: str = "last",
ignore_index: bool = False,
key: ValueKeyFunc = None,
):
(4)其他操作
print(df.index) # 行索引
print(df.columns) # 列索引
print(df.shape) # 形状
print(df.dtypes) # 各列的数据类型
print(df.ndim) # 数据的维度
print(df.head(3)) # 显示数据的前3行,默认显示5行
print(df.tail(3)) # 显示数据的最后3行,默认显示5行
print(df.info()) # 展示df的各种信息
print(df.describe()) # 统计数据列的总数、均值、标准差、最小值、最大值、中位数等
数据df:
W X Y Z
a 18 71.49 7.60 996.0
b 19 NaN 7.56 NaN
c 20 70.68 7.72 521.0
d 21 69.31 NaN 218.0
e 22 66.90 7.84 448.0
注:以下操作均以数据df为基础
(1)删除行:dropna()函数
>>> df.dropna(axis=0) # 当行中有NaN,便删除此行
W X Y Z
a 18 71.49 7.60 996.0
c 20 70.68 7.72 521.0
e 22 66.90 7.84 448.0
>>> df.dropna(axis=0, how="all") # 当一行全为NaN,才删除此行
W X Y Z
a 18 71.49 7.60 996.0
b 19 NaN 7.56 NaN
c 20 70.68 7.72 521.0
d 21 69.31 NaN 218.0
e 22 66.90 7.84 448.0
>>> df.dropna(axis=0, inplace=True) # inplace:原地修改df
>>> df
W X Y Z
a 18 71.49 7.60 996.0
c 20 70.68 7.72 521.0
e 22 66.90 7.84 448.0
注:dropna参数默认值如下:
def dropna(
self,
axis: Axis = 0,
how: str = "any",
thresh=None,
subset=None,
inplace: bool = False,
):
(2)填充数据:fillna()函数
>>> df.fillna(100) # 填充固定值
W X Y Z
a 18 71.49 7.60 996.0
b 19 100.00 7.56 100.0
c 20 70.68 7.72 521.0
d 21 69.31 100.00 218.0
e 22 66.90 7.84 448.0
>>> df.fillna(df.mean()) # 所有列进行填充,填充列中非空数据的平均值
W X Y Z
a 18 71.490 7.60 996.00
b 19 69.595 7.56 545.75
c 20 70.680 7.72 521.00
d 21 69.310 7.68 218.00
e 22 66.900 7.84 448.00
>>> df["Z"].fillna(df["Z"].mean()) # 某一列进行填充,填充列中非空数据的平均值
a 996.00
b 545.75
c 521.00
d 218.00
e 448.00
Name: Z, dtype: float64
数据:
a = [1, 3, 5]
b = [2, 4, 6, 7]
(1)使用“+”号
>>> a + b
[1, 3, 5, 2, 4, 6, 7]
(2)extend()函数
>>> a.extend(b)
>>> a
[1, 3, 5, 2, 4, 6, 7]
(3)列表表达式
>>> c = [a, b]
>>> d = [i for _c in c for i in _c]
>>> d
[1, 3, 5, 2, 4, 6, 7]
数据:
>>> dict = {"a": [], "b": [], "c": []}
>>> dict
{'a': [], 'b': [], 'c': []}
(1)添加字段:update()函数
>>> dict.update({"new": []})
>>> dict
{'a': [], 'b': [], 'c': [], 'new': []}
def dfToCSV(file_name, col_name, data):
import csv
with open(file_name+".csv", "w", encoding="gbk", newline="") as f:
# 2. 基于文件对象构建 csv写入对象
csv_writer = csv.writer(f)
# 3. 构建列表头
csv_writer.writerow(col_name)
# 4. 写入csv文件内容
for i in range(data.shape[0]):
csv_writer.writerow(data.iloc[i])
print("写入数据成功")
# 5. 关闭文件
f.close()
调用方式:
dfToCSV("6666666", df.columns, df)