【pandas小技巧】--缺失值的列
在实际应用中,数据集中经常会存在缺失值,也就是某些数据项的值并未填充或者填充不完整。缺失值的存在可能会对后续的数据分析和建模产生影响,因此需要进行处理。
pandas提供了多种方法来处理缺失值,例如删除缺失值、填充缺失值等。
删除缺失值可能会导致数据量减少,填充缺失值则能够尽量保留原始数据集的完整性,从而提高数据分析和建模的准确性和可靠性。
当数据集中存在缺失值时,我们通常需要进行以下操作:
[*]检查缺失值的数量和分布情况,了解缺失值对数据的影响程度。
[*]根据数据的类型和业务需求,选择合适的缺失值处理方法,并对缺失值进行处理。
[*]在处理缺失值的同时,要注意保持数据集的一致性和完整性。
[*]处理完缺失值后,可以进行后续的数据分析和建模,从而得出更准确和可靠的结论。
1. 缺失值统计
首先我们随机创建一个包含缺失值的测试数据集,这里用到之前介绍过的创建测试数据的技巧。
import pandas as pd
def get_random_missing_data():
df = pd.util.testing.makeMissingDataframe()
return df
df = get_random_missing_data()
dfhttps://cdn.nlark.com/yuque/0/2023/png/2235414/1683977938393-febe300f-9437-4614-be87-4687f02a8428.png#averageHue=%23e5e5e5&clientId=uc34eaa35-4d52-4&from=paste&height=360&id=u2ac85b60&originHeight=360&originWidth=481&originalType=binary&ratio=1&rotation=0&showTitle=false&size=37303&status=done&style=stroke&taskId=u5fb1d118-5606-4157-a957-ba8590018e3&title=&width=481
这里我封装了一个简单的函数get_random_missing_data,通过这个函数,可以创建一个每行至少有一个缺失值的数据集。
注意:这是随机创建的数据集,所以每次运行的结果会不一样。
统计缺失值很简单,首先通过isna函数找出所有缺失的值,然后可以使用sum或者mean来统计缺失的数量和比例。
df.isna().sum()https://cdn.nlark.com/yuque/0/2023/png/2235414/1683977964998-549eb690-49b7-42f9-ae7c-b9c1a3dc52fa.png#averageHue=%23eeeeee&clientId=uc34eaa35-4d52-4&from=paste&height=119&id=u60d56d78&originHeight=119&originWidth=143&originalType=binary&ratio=1&rotation=0&showTitle=false&size=4141&status=done&style=stroke&taskId=uf6b16d6e-08d5-4582-81dd-0d32275d1ad&title=&width=143
sum函数返回的是每一列缺失值的数量。
df.isna().mean()https://cdn.nlark.com/yuque/0/2023/png/2235414/1683977996454-820822ef-c133-4169-bb76-1097cae21920.png#averageHue=%23e6e6e6&clientId=uc34eaa35-4d52-4&from=paste&height=117&id=ub2d24383&originHeight=117&originWidth=156&originalType=binary&ratio=1&rotation=0&showTitle=false&size=9196&status=done&style=stroke&taskId=u0bbba927-2f86-4235-9cb4-34e9abb989d&title=&width=156
mean函数返回的值可以看做每一列缺失值占的比例。
2. 删除缺失值
处理缺失值时,有些场景为了保证数据的完整性,只能删掉有缺失的数据。
删除缺失值有2个重要的参数:how 和 axis。
how有2个可选值:
[*]any:这是默认值,表示行数据或者列数据中有一个缺失值,就删除此行或此列
[*]all:表示行数据或者列数据中所有值都缺失时,才删除此行或此列
axis也有2个可选值:
[*]0 或 index:按行判断是否有缺失值
[*]1 或 columns:按列判断是否有缺失值
how="any",axis=0的情况:每行数据中只要有一个缺失值就删除该行。
df = pd.DataFrame(
{
"A": ,
"B": ,
"C": ,
"D": ,
}
)
df.dropna(how="any", axis=0)https://cdn.nlark.com/yuque/0/2023/png/2235414/1683977299749-a7df7e33-e2a2-48d5-bfaa-8063dbd4862e.png#averageHue=%23f1eded&clientId=uc34eaa35-4d52-4&from=paste&height=188&id=u28e581bd&originHeight=188&originWidth=498&originalType=binary&ratio=1&rotation=0&showTitle=false&size=21157&status=done&style=stroke&taskId=u4498daf3-04f3-463d-99e7-ca1fd1b88ae&title=&width=498
how="all",axis=0的情况:每行数据中,全部值都缺失的行才删除。
df = pd.DataFrame(
{
"A": ,
"B": ,
"C": ,
"D": ,
}
)
df.dropna(how="all", axis=0)https://cdn.nlark.com/yuque/0/2023/png/2235414/1683977479504-cb0844a3-9318-447f-b6f3-a601cc6e446f.png#averageHue=%23efebeb&clientId=uc34eaa35-4d52-4&from=paste&height=192&id=u45cfa2ff&originHeight=192&originWidth=568&originalType=binary&ratio=1&rotation=0&showTitle=false&size=31244&status=done&style=stroke&taskId=u2ad4ce68-3e7b-4d03-a4b3-be86bda21e7&title=&width=568
how="any",axis=1的情况:每列数据中只要有一个缺失值就删除该列。
df = pd.DataFrame(
{
"A": ,
"B": ,
"C": ,
"D": ,
}
)
df.dropna(how="any", axis=1)https://cdn.nlark.com/yuque/0/2023/png/2235414/1683977655001-2e83d709-e3f4-48dc-aed0-58f62f56bc9f.png#averageHue=%23f0ebeb&clientId=uc34eaa35-4d52-4&from=paste&height=193&id=u9e1a3b63&originHeight=193&originWidth=400&originalType=binary&ratio=1&rotation=0&showTitle=false&size=19954&status=done&style=stroke&taskId=u4d9bcee0-c7df-41c2-b27b-baab081ce71&title=&width=400
how="all",axis=1的情况:每列数据中,全部值都缺失的列才删除。
df = pd.DataFrame(
{
"A": ,
"B": ,
"C": ,
"D": ,
}
)
df.dropna(how="all", axis=1)https://cdn.nlark.com/yuque/0/2023/png/2235414/1683977838586-670dfe6c-3c25-4b89-af0b-b28300f6377b.png#averageHue=%23eeebeb&clientId=uc34eaa35-4d52-4&from=paste&height=199&id=u85438a55&originHeight=199&originWidth=545&originalType=binary&ratio=1&rotation=0&showTitle=false&size=32180&status=done&style=stroke&taskId=uf8ae313f-34ed-40d4-9fe9-f69c283418f&title=&width=545
3. 填充缺失值
填充缺失值一般使用fillna函数指定填充什么样的值。
比如:
df = pd.DataFrame(
{
"A": ,
"B": ,
"C": ,
"D": ,
}
)
df.fillna(-1)https://cdn.nlark.com/yuque/0/2023/png/2235414/1683978616501-ae80e32e-7841-4324-9922-c99dcea20763.png#averageHue=%23ede7e6&clientId=uc34eaa35-4d52-4&from=paste&height=186&id=uc1f09e8f&originHeight=186&originWidth=525&originalType=binary&ratio=1&rotation=0&showTitle=false&size=29660&status=done&style=stroke&taskId=u39df6e77-fa84-475e-ba97-d0458b9a7f1&title=&width=525
这里是用 -1 来填充的,根据实际情况可以使用任意合适的值来填充。
除了 fillna 函数之外,还有一个interpolate函数,能够更加合理的填充缺失值。
df = pd.DataFrame(
{
"A": ,
"B": ,
"C": ,
"D": ,
}
)
df.interpolate()https://cdn.nlark.com/yuque/0/2023/png/2235414/1683979099937-c0522512-6cf3-4d53-94c5-27d1765d6947.png#averageHue=%23ede2e1&clientId=uc34eaa35-4d52-4&from=paste&height=184&id=u2b58139b&originHeight=184&originWidth=541&originalType=binary&ratio=1&rotation=0&showTitle=false&size=34479&status=done&style=stroke&taskId=ue13d9081-b829-42e0-b10e-d069fb761fe&title=&width=541
每个缺失值都是它上下两行的值的平均值。
如果只有上面行的值,那就直接用上面行的值。
这里有个注意的地方:如果是第一行有缺失的话,那么是无法填充的。
比如:
df = pd.DataFrame(
{
"A": ,
"B": ,
"C": ,
"D": ,
}
)
df.interpolate()https://cdn.nlark.com/yuque/0/2023/png/2235414/1683979496820-d6e7bb49-64ba-45a1-b44c-277b2e98c499.png#averageHue=%23edeaea&clientId=uc34eaa35-4d52-4&from=paste&height=193&id=u807d0ed3&originHeight=193&originWidth=549&originalType=binary&ratio=1&rotation=0&showTitle=false&size=35589&status=done&style=stroke&taskId=ud8dac1c8-04bc-4882-8df8-f2006c81544&title=&width=549
第一行的缺失值没有上一行可以参照,还是维持原来缺失的状态。
所以使用 interpolate 进行填充时,注意第一行的缺失值状态,可以用 fillna 先处理第一行。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页:
[1]