pandas-直接上手操作

创建数据

# 列表创建==================
data = [[1, 2, 3], [6, 5, 4], [7, 8, 9]]
columns = ["第一列", "第二列", "第三列"]
df = pd.DataFrame(data, columns=columns)
# 字典创建================== data = { "A": [1, 2, 3], "B": "ok", "C": "C" } df = pd.DataFrame(data)

 

读取文件

#读取指定文件(其他文件类似):文件名称, 列名称, 表头, 跳过那些行不读取
df = pd.read_excel(path, sheet_name="", usecols="", header=0,skiprows=[3,6])
df = pd.read_excel(sheetname="a" 或者 sheetname=["a","b"]  单个数据:直接传值, 多个数据:传列表即可

#转为二维列表:只转某列或者转换整个Dataframe
list(df)  ==  df.values.tolist()
list(df["grammer"])  ==  df["grammer"].values.tolist()

 

查看Dataframe基础信息

df.dtypes
df.columns
df.index
df.values
df.describe()

 

快速查看-首尾的-行数据

# 括号内可以传参,T 是转置
df.head()
df.tail()
df.T

 

查看修改:行数据,列数据,值数据

# 选择列数据,一列或者多列
df["A"]
df[["A", "B"]]

# 选择行数据-切片:包头不包尾部:index
df[0:1]
df.iloc[2].values.tolist()

# 从中间切一部分:行:列==index:columns
df.loc[:, ["A", "C"]] # 只取值列数据,行数据全取
df.loc[2, "C"]  # 十字坐标取值
df.at[0, "C"]  # 十字坐标取值
df.iloc[0:2, 1:3]
df.iloc[:, 1:3]
df.iloc[1:4, :]  # 只取值行数据,列数据全取
df.iloc[[1, 2, 4], [2, 5]]
df.iloc[1, 1]  # 十字坐标取值

# 原地修改数据:修改单个值
df.at[0,"A"] = 999
df.iat[0, 0] = 999

# 原地修改数据:修改列数据
df.loc[:, "D"] = [5] * 3

df[df>2] = -df # 纯数字表,可以直接取反

 

 

 排序

df.sort_index(axis=1, ascending=False)
df = df.sort_values(by="A")

 

判断取值:数字用等号,字符串用in

# 两种写法,作用相等
res = df[df["A"] > 2]
res = df[df.A > 2]

res = df[df["B"].isin(["ok", "OK"])]

 

新增列数据

# 增加一个Dataframe 列数据
s1 = pd.DataFrame({"D": ["tom", "jerry", "jack"]})
df["D"] = s1

 

 

3.数据保存,保存文件

#其他格式:to_XX即可
df.to_excel(path, sheet_name)

 

4.读取数据:指定列,指定行

#提取指定列:参数为列名称=====================================
df["grammer"]

#提取指定行【方法一】:参数为列名称,行关键词====================
df[df["grammer"]=="python"]
#提取含有python的行,参数:列名称,关键词

#提取指定行【方法二】:参数为列名称,行关键词====================
res = df["grammer"].str.contains("python")
#找到bool值,获取含有True的行
res.fillna(value = False, inplace=True)
df[res]

#提取指定行【方法三】:参数为,指定行号,也可以list成列表=========
res = df.loc[3]
list(res)

#读取开头或者尾部数据(和shell的使用相似)可以指定显示行数========
df.tail(3)
df.head(3)

 

5.获取表格的大小,行数,列数,数据类型,类型转换

# 查看表头: ['grammer', 'score']
list(df.columns) == df.columns.values  

# 查看表index列:[0, 1, 2, 3, 4, 5, 6, 7]
list(df.index) == df.index.values  

#获取数组形状:几行几列,返回元祖类型(2,3)
df.shape
df.shape[0] # 返回行数, [1]返回列数 df.info()
#显示索引,数据类型,内存信息 df.dtypes #查看每列的数据类型 df["score"].astype(np.int64) df["score"].astype("int") #列数据类型转换,数据类型多为64 df.size df.values df.T pd.__version__ :获取版本号

 

6.修改列名称,设置列索引

df.rename(columns={"score":"popularity"},inplace = True)#修改列名称
df

df.set_index("score") #设置某列为索引

 

7.统计元素的出现次数,列统计

df["grammer"].value_counts()
df.grammer.value_counts
#两种方法一致

df.value_counts() #全表的统计
# 参数:列名称, 注意小括号

len(df[df["score"]>8])
#统计某列,数据大于8的次数个数

df.score.nunique()
#查看某列共有几种数据,相当于去重后,统计个数

 

 

8.空值填充:用上下文的平均值填充【空值填充】

df["popularity"] = df["popularity"].fillna(df["popularity"].interpolate())

df["grammer"] = df["grammer"].fillna("R") #给指定列填充空值(填充为R)

df.isnull().values.any() #检查数据中是否有空值【返回有TRUE或者无FALSE】

df["A].fillna(method="pad", inplace=True) # 使用上文对下文进行填充
# all:整行为空值,即删除空行,any:只有有一个空值,就删除行, 
# axis:0为行,1为列
# subset: 指定列中找缺失值
df.dropna(how="all", axis=0, subset=["a", "b"]) 

# nan值转为空字符,等于replace
"""
value:填充替换为的值
method:pad、ffill前值填充, backfill、bfill 后值填充
limit: 限定个数
"""
df.fillna(value, method, axis=None, inplace=True, limit=None) 
df.replace() 
df.str.replace()
df.dropna() # 删除包含空值的全部行
df.dropna(subset=["列名"], inplace=True, how="all")

 

 

9.条件取值:判断后,提取满足条件的值

#提取列中值大于3的行==================================
res = df["popularity"]>3
df[res]
#也可以写成一行代码
df[df["popularity"]>3]

#提取大于3,小于7的数据===============================
res1 =  df["popularity"] < 7 
res2 = df["popularity"] >3
df[res1 &res2]
#写成一行代码,注意加上小括号
df[(df["popularity"] < 7) & (df["popularity"] >3)]

# str.contains包含某值,等于 in 方法
df[(df["a"].str.contains("#"))]
df[~(df["a"].str.contains("#"))]  # 取反,等于 not in

# 是否包含值: hello word
df.isin(["hello", "word"])

 

 

10.按照列去重

df.drop_duplicates(["grammer"])

 

11.求指定列的最大值,最小值,平均值,中位数,最值方差

df["score"].mean()
df["score"].min()
df["score"].max()
#不加小括号,则显示列的全部值,方法不生效
np.median(df["score"]) #平均值

#获取最大值,所在行数据==========================
res = df["popularity"]==df["popularity"].max()
df[res]
#写成一行
df[df["popularity"]==df["popularity"].max()]

#计算某列最大值与最小值之差
df[["score"] ].apply(lambda x:x.max()-x.min())
np.ptp(df["score"])

 

 

12.拼接数据,合并数据concat

#拼接第一行和最后一行
pd.concat([df[:1], df[-2:-1]])

df = pd.concat([df1,df2), axis=1)
df

 

13.合并两列数据,合并数据,列相减,列相加

df["new"] = df["score"] + df["grammer"]
df["new"] = df["score"] - df["grammer"]


df["new"] = df["score"].map(str) + df["grammer"].map(str)
df 

#合并两列数据为新的一列【需要先去除空值,转为同类型,才能相加】

 

 

14.交换两个列的位置

res = df.columns[[1,0]]
df[res]
#只有第一步,不会生效,只是展示

15.添加数据

# 添加数据append,括号内指的是第八行数据
df.append(df.iloc[7])

 

 

 16.空值处理

 

 

17.删除数据,删除最后一行数据

df.drop([len(df)-1], inplace=True) #删除最后一行,依据行号

del df["列名称"] #删除列
df.drop(columns=["score"], inplace=True) #删除列

 

 

 18.排序

df.sort_values("score",inplace=False, ascending=False) 
#inplace是否修改原表,ascending升降序

 

19.新增数据

#生成指定长度的数据,randint(开始,结束,个数)
pd.DataFrame(pd.Series(np.random.randint(1,10,8)))

 

 

20.计算某列的长度,并生成新列

df["len_str"] =  df["grammer"].map(lambda x: len(x)) 
"""
1.空值填充后处理
2.增加新列
3.使用map和lambda来计算长度
"""

21.pandas的str处理方法

 

22.修改列数据:对指定列数据,进行转换修改

#方法一:=====================
def func(df):
    lst = df["score"]
    df["new_score"] = lst*100
    return df
func(df)
df

#方法二:=====================
def func(df):
    lst = df["score"]
    df["new_score"] = lst*100
    return df
df = df.apply(func, axis=1)
df

23.根据指定列,进行分组计算平均值

print(df.groupby("grammer").mean())
"""
         score  len_str  new_score
grammer                           
R          5.0      1.0      500.0
c          2.0      1.0      200.0
c++       10.0      3.0     1000.0
go         4.0      2.0      400.0
java       NaN      4.0        NaN
php        7.0      3.0      700.0
python     1.0      6.0      100.0
sql       66.0      3.0     6600.0
"""

24.对列中的时间进行转换

for i in range(len(df)):
    df.ix[i, 0] = df.ix[i,0].topydate("%Y-%m-%D %H-%M-%S")
#先遍历,再转换。

 25.对数值型的列,进行汇总统计

df.describe()
#对数值型的列,自动统计

 

26.新增一列,根据某列,将数据分组

data = [0,3,6,10]  #四个数值,分为三段
gropname = ["","",""] #本行和上面一行,数量要对应
df["分组"] = pd.cut(df["score"], data, labels=gropname)
df

27.绘制某列的频率直方图

import matplotlib.pyplot as plt
df.score.plot(kind="hist")

28.绘制某列的水平密度曲线,类似于正态分布图

df.score.plot(kind="kde", xlim=(0,8))
#score是某列的名称

 29.增加行数据的两种方法

import pandas as pd

# 方法一:concat===================================
def pandas_append(df, data_list):
    """给df新增行数据:data_list"""
    if isinstance(data_list, list):
        new_data = {key: [data_list[num]] for num, key in enumerate(list(df))}
        df2 = pd.DataFrame(new_data)
        new_df = pd.concat([df, df2], ignore_index=True)
        return new_df
    print(f"{data_list}不是列表数据,请检查!!")

df1 = pd.DataFrame(
    {"name": ["tome", "jerry"],
     "age": [22, 33]}
)
print(df1)
data = ["peper", 44]
res = pandas_append(df1, data)
print(res)
# 方法二:append===================================
df1.append({"name":"alice","age":11})
print(df1)

 

posted @ 2022-11-26 20:34  zwx901323  阅读(209)  评论(0)    收藏  举报