df.isnull()这个命令,是将数据集的nan值显示为1,不为nan值的显示为0
说实话,df.isnull() 在我看来没什么用,对于一个海量数据来讲,一眼根本就看不出来哪里是 nan值,哪里不是nan值,当然你要专门统计个数的话,可以使用,举个例子来看
import pandas as pd
df1 = pd.DataFrame({"name": ["小王", "小红", "小芳", "小明"], "age": [18, 19, 20, 22], "sex": ["男", "女", "女", "男"]})
df2 = pd.DataFrame({"name": ["小王", "小红", "小芳", "小绿"], "score": [100, 98, 95, 60], "sex": ["男", "女", "女", "男"]})
# 这里为举例子的全面性,使用左连接生成一个df,suffixes=["_old", "_new"]我个人偏向于这种写法,因为左连接,一般是将右表的内容更新给左表,那么用old和new一眼就可以看出哪个是要被替换的数据
df = pd.merge(df1, df2, on=["name"], suffixes=["_old", "_new"], how="left")
print(df)
命令:df[df.isnull().values==True]
这个命令数据呈现如下图所示,(按理说应该只有一条记录,但是这里出现两条,但是无伤大雅,明显能看出来这是同一条记录,因为index相同,这个为什么这样我后面再研究下,对我要说的结论没有影响),很清晰的把数据集所有行中出现nan的原数据显示给你
df[df.score.isnull().values==True]
当然,如果你不关心所有的出现nan的数据,只关心拼接后的某一列是否有nan值的出现,那么这个命令同样非常友好:df[df.列名.isnull().values==True]
例如我只关心两个表拼接后,有没有同学没有成绩呢,那么就要看score这个列有没有nan值就可以了,结果如下图所示,很准确的定位到你所需要查看的数据
这个主要涉及到datetime中日期的加减,遇到了坑,需求如下:需要将日期数据列(date类型)和整形数字列(int类型)相加,计算新的日期,详见下方代码,代码下方是例子
import datetime
######################### 错误的写法 #########################
# 一般人可能第一印象就如同我如下的写法一样,但是series不支持
# 假设数据如下, ord_dt为订货时间, days为送货天数, 现在要将订货时间+送货时间算出到货时间
df = pd.DataFrame({"name": ["小明", "小红", "小李"], "ord_dt": ["2020-05-01", "2020-05-01", "2020-05-01"], "days": [10, 3, 4]})
df["ord_dt"] = pd.to_datetime(df["ord_dt"])
df["arr_dt"] = df["ord_dt"] + datetime.timedelta(days=df["days"])
print(df)
# 程序报错,信息如下
Traceback (most recent call last):
File "/home/chen/pycharm-folder/pycharm-2019.3.3/plugins/python/helpers/pydev/pydevd.py", line 1434, in _exec
pydev_imports.execfile(file, globals, locals) # execute the script
File "/home/chen/pycharm-folder/pycharm-2019.3.3/plugins/python/helpers/pydev/_pydev_imps/_pydev_execfile.py", line 18, in execfile
exec(compile(contents+"\n", file, 'exec'), glob, loc)
File "/home/chen/PycharmProjects/requests_check/main.py", line 13, in
df["arr_dt"] = df["ord_dt"] + datetime.timedelta(days=df["days"])
TypeError: unsupported type for timedelta days component: Series
######################### 错误的写法 #########################
######################### 正确的写法 #########################
import datetime
# 假设数据如下, ord_dt为订货时间, days为送货天数, 现在要将订货时间+送货时间算出到货时间
df = pd.DataFrame({"name": ["小明", "小红", "小李"], "ord_dt": ["2020-05-01", "2020-05-01", "2020-05-01"], "days": [10, 3, 4]})
# 这里的转化日期写法是为了不要时分秒,我目前摸索出来的方法只有这个可以只显示到日期,但是效率不高
df["ord_dt"] = df["ord_dt"].apply(lambda x: pd.to_datetime(x).date())
# 用lambda函数的方式进行日期的加减就可以了
df["arrdt"] = df.apply(lambda x: x.ord_dt + datetime.timedelta(days=x.days), axis=1)
print(df)
######################### 正确的写法 #########################
初始数据集
计算之后的数据集,到货时间分别为2020-05-11···
**分组聚合(df.groupby())**是pandas中比较常用的命令,有几个点我还是强调一下
# 需求为,程序要统计男生和女生数量
# ########################## 不加聚合条件的程序和结果 ##########################
df = pd.DataFrame({"name": ["小王", "小红", "小芳", "小绿"], "score": [100, 98, 95, 60], "sex": ["男", "女", "女", "男"]})
# 如果不加聚合条件
df = df.groupby(["sex"])
print(df)
df =
# ########################## 不加聚合条件的程序和结果 ##########################
# ########################## 加聚合条件的结果 ##########################
df = pd.DataFrame({"name": ["小王", "小红", "小芳", "小绿"], "score": [100, 98, 95, 60], "sex": ["男", "女", "女", "男"]})
# 增加聚合条件,则可以重新生成一张新表
df = df.groupby(["sex"]).count()
print(df)
结果如下图所示
# ########################## 加聚合条件的结果 ##########################
2. 但是你会发现,你要统计的列名成了索引,这在后面的操作可能不太方便,(当时困扰了我很久,因为我后面还需要这个新生成的临时表的列名做级联更新操作),还是需要将sex作为列名显示,那么有个参数你需要加上,as_index=False
df = pd.DataFrame({"name": ["小王", "小红", "小芳", "小绿"], "score": [100, 98, 95, 60], "sex": ["男", "女", "女", "男"]})
# 增加as_index参数可以将数据按原格式返回,并生成一张新表,方便在后面用作拼接等操作
df = df.groupby(["sex"], as_index=False).count()
print(df)
# 结果如下,可以看到是以原有表列名的方式返回新的数据集