ใน Python Pandas วิธีที่ดีที่สุดในการตรวจสอบว่า DataFrame มีหนึ่ง NaN มากกว่าหนึ่งค่าคืออะไร
ฉันรู้เกี่ยวกับฟังก์ชั่นpd.isnan
นี้ แต่คืนค่า DataFrame ของ booleans สำหรับแต่ละองค์ประกอบ โพสต์นี้ตรงนี้ไม่ตอบคำถามของฉันอย่างแน่นอน
ใน Python Pandas วิธีที่ดีที่สุดในการตรวจสอบว่า DataFrame มีหนึ่ง NaN มากกว่าหนึ่งค่าคืออะไร
ฉันรู้เกี่ยวกับฟังก์ชั่นpd.isnan
นี้ แต่คืนค่า DataFrame ของ booleans สำหรับแต่ละองค์ประกอบ โพสต์นี้ตรงนี้ไม่ตอบคำถามของฉันอย่างแน่นอน
คำตอบ:
คำตอบของjwilnerคือจุดที่ ฉันสำรวจเพื่อดูว่ามีตัวเลือกที่เร็วกว่านี้หรือไม่เนื่องจากจากประสบการณ์ของฉันการรวมอาร์เรย์แบบแบนนั้นเร็วกว่าการนับ รหัสนี้ดูเร็วขึ้น:
df.isnull().values.any()
ตัวอย่างเช่น:
In [2]: df = pd.DataFrame(np.random.randn(1000,1000))
In [3]: df[df > 0.9] = pd.np.nan
In [4]: %timeit df.isnull().any().any()
100 loops, best of 3: 14.7 ms per loop
In [5]: %timeit df.isnull().values.sum()
100 loops, best of 3: 2.15 ms per loop
In [6]: %timeit df.isnull().sum().sum()
100 loops, best of 3: 18 ms per loop
In [7]: %timeit df.isnull().values.any()
1000 loops, best of 3: 948 µs per loop
df.isnull().sum().sum()
เป็นบิตช้า แต่แน่นอนมีข้อมูลเพิ่มเติม - NaNs
จำนวน
pandas
ไม่มีฟังก์ชันในตัวสำหรับสิ่งนี้ มันเป็นความจริงจากโพสต์ของ @ JGreenwell ที่df.describe()
สามารถทำได้ แต่ไม่มีฟังก์ชั่นโดยตรง
df.describe()
(โดยไม่ต้องค้นหาNaN
) ด้วยอาเรย์ 1,000 x 1,000 การโทรครั้งเดียวใช้เวลา 1.15 วินาที
df.isnull().values.sum()
มันยังเร็วกว่าเล็กน้อยdf.isnull().values.flatten().sum()
.flatten()
โปสเตอร์ ขอบคุณ
df.isnull().values.any()
สำหรับฉันมันเร็วกว่าคนอื่น ๆ
คุณมีสองทางเลือก
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(10,6))
# Make a few areas have NaN values
df.iloc[1:3,1] = np.nan
df.iloc[5,3] = np.nan
df.iloc[7:9,5] = np.nan
ตอนนี้ data data มีลักษณะดังนี้:
0 1 2 3 4 5
0 0.520113 0.884000 1.260966 -0.236597 0.312972 -0.196281
1 -0.837552 NaN 0.143017 0.862355 0.346550 0.842952
2 -0.452595 NaN -0.420790 0.456215 1.203459 0.527425
3 0.317503 -0.917042 1.780938 -1.584102 0.432745 0.389797
4 -0.722852 1.704820 -0.113821 -1.466458 0.083002 0.011722
5 -0.622851 -0.251935 -1.498837 NaN 1.098323 0.273814
6 0.329585 0.075312 -0.690209 -3.807924 0.489317 -0.841368
7 -1.123433 -1.187496 1.868894 -2.046456 -0.949718 NaN
8 1.133880 -0.110447 0.050385 -1.158387 0.188222 NaN
9 -0.513741 1.196259 0.704537 0.982395 -0.585040 -1.693810
df.isnull().any().any()
- สิ่งนี้จะคืนค่าบูลีนคุณจะรู้ว่าสิ่งisnull()
ใดที่จะส่งคืนชื่อไฟล์เช่นนี้:
0 1 2 3 4 5
0 False False False False False False
1 False True False False False False
2 False True False False False False
3 False False False False False False
4 False False False False False False
5 False False False True False False
6 False False False False False False
7 False False False False False True
8 False False False False False True
9 False False False False False False
หากคุณทำdf.isnull().any()
คุณจะพบเพียงคอลัมน์ที่มีNaN
ค่า:
0 False
1 True
2 False
3 True
4 False
5 True
dtype: bool
อีกหนึ่ง.any()
จะบอกคุณถ้าใด ๆ ข้างต้นเป็นTrue
> df.isnull().any().any()
True
df.isnull().sum().sum()
- สิ่งนี้คืนค่าจำนวนเต็มของค่าทั้งหมดNaN
:สิ่งนี้ทำงานในลักษณะเดียวกับที่.any().any()
ทำได้โดยให้ผลรวมของจำนวนNaN
ค่าในคอลัมน์ก่อนจากนั้นจึงรวมค่าเหล่านั้น:
df.isnull().sum()
0 0
1 2
2 0
3 1
4 0
5 2
dtype: int64
สุดท้ายเพื่อรับจำนวน NaN ค่าทั้งหมดใน DataFrame:
df.isnull().sum().sum()
5
.any(axis=None)
แทน.any().any()
?
วิธีค้นหาแถวที่มี NaNs ในคอลัมน์ใดคอลัมน์หนึ่ง:
nan_rows = df[df['name column'].isnull()]
non_nan_rows = df[df['name column'].notnull()]
เพื่อหาที่แถวไม่ได้มีแก่นแก้วในคอลัมน์ที่เฉพาะเจาะจง:
หากคุณต้องการทราบจำนวนแถวที่มี "หนึ่งหรือมากกว่าNaN
":
df.isnull().T.any().T.sum()
หรือถ้าคุณต้องการที่จะดึงแถวเหล่านี้ออกมาและตรวจสอบพวกเขา:
nan_rows = df[df.isnull().T.any().T]
df.isnull().any().any()
ควรทำมัน
การเพิ่มคำตอบที่ยอดเยี่ยมของ Hobs ฉันเป็นคนใหม่ใน Python และ Pandas ดังนั้นโปรดชี้ให้เห็นว่าฉันผิด
ในการค้นหาว่าแถวใดมี NaNs:
nan_rows = df[df.isnull().any(1)]
จะทำการดำเนินการเดียวกันโดยไม่จำเป็นต้องมีการแปลงโดยระบุแกนของ () ใด ๆ เป็น 1 เพื่อตรวจสอบว่ามี 'True' อยู่ในแถวหรือไม่
any(axis=1)
เรียบง่ายกระชับของคุณ
df.isna().any(axis=None)
เริ่มต้นจาก v0.23.2คุณสามารถใช้DataFrame.isna
+ DataFrame.any(axis=None)
โดยที่axis=None
ระบุการลดลงแบบลอจิคัลเหนือ DataFrame ทั้งหมด
# Setup
df = pd.DataFrame({'A': [1, 2, np.nan], 'B' : [np.nan, 4, 5]})
df
A B
0 1.0 NaN
1 2.0 4.0
2 NaN 5.0
df.isna()
A B
0 False True
1 False False
2 True False
df.isna().any(axis=None)
# True
numpy.isnan
ตัวเลือกนักแสดงอื่นหากคุณกำลังใช้แพนด้าเวอร์ชันเก่า
np.isnan(df.values)
array([[False, True],
[False, False],
[ True, False]])
np.isnan(df.values).any()
# True
หรือตรวจสอบผลรวม:
np.isnan(df.values).sum()
# 2
np.isnan(df.values).sum() > 0
# True
Series.hasnans
คุณยังสามารถโทรซ้ำSeries.hasnans
ๆ ได้ ตัวอย่างเช่นเพื่อตรวจสอบว่าคอลัมน์เดียวมี NaNs หรือไม่
df['A'].hasnans
# True
และเพื่อตรวจสอบว่าคอลัมน์ใดมี NaNs คุณสามารถใช้ความเข้าใจกับany
(ซึ่งเป็นการดำเนินการลัดวงจร)
any(df[c].hasnans for c in df)
# True
อันนี้จริงเร็วมาก
hasnans
เนื่องจากไม่มีผู้ใดได้กล่าวถึงมีเพียงตัวแปรอื่นที่เรียกว่า
df[i].hasnans
จะส่งออกไปTrue
หากหนึ่งในค่าของ pandas Series เป็น NaN False
หากไม่ได้ โปรดทราบว่ามันไม่ใช่ฟังก์ชั่น
เวอร์ชันของแพนด้า 0.19.2 และ 0.20.2
df = DataFrame([1,None], columns=['foo'])
แล้วdf.hasnans
จะโยนAttributeError
แต่จะกลับมาdf.foo.hasnans
True
ให้df
เป็นชื่อของ Pandas DataFrame และค่าใด ๆ ที่เป็นnumpy.nan
ค่า Null
df.isnull().any()
df.loc[:, df.isnull().any()].columns
df.isna().sum()
หากคุณต้องการดูเปอร์เซ็นต์ของโมฆะในทุกคอลัมน์
df.isna().sum()/(len(df))*100
df.loc[:,list(df.loc[:,df.isnull().any()].columns)].isnull().sum()/(len(df))*100
แก้ไข 1:
หากคุณต้องการดูว่าข้อมูลของคุณหายไปทางสายตา:
import missingno
missingdata_df = df.columns[df.isnull().any()].tolist()
missingno.matrix(df[missingdata_df])
df.isna().sum()
?
เพียงใช้ math.isnan (x) Return True ถ้า x เป็น NaN (ไม่ใช่ตัวเลข) และ False เป็นอย่างอื่น
math.isnan(x)
จะใช้งานได้เมื่อx
เป็น DataFrame คุณได้รับ TypeError แทน
df.isnull().sum()
สิ่งนี้จะให้คุณนับค่า NaN ทั้งหมดที่มีอยู่ใน coloums ที่เกี่ยวข้องของ DataFrame
นี่เป็นอีกวิธีที่น่าสนใจในการค้นหาค่าว่างและแทนที่ด้วยค่าที่คำนวณได้
#Creating the DataFrame
testdf = pd.DataFrame({'Tenure':[1,2,3,4,5],'Monthly':[10,20,30,40,50],'Yearly':[10,40,np.nan,np.nan,250]})
>>> testdf2
Monthly Tenure Yearly
0 10 1 10.0
1 20 2 40.0
2 30 3 NaN
3 40 4 NaN
4 50 5 250.0
#Identifying the rows with empty columns
nan_rows = testdf2[testdf2['Yearly'].isnull()]
>>> nan_rows
Monthly Tenure Yearly
2 30 3 NaN
3 40 4 NaN
#Getting the rows# into a list
>>> index = list(nan_rows.index)
>>> index
[2, 3]
# Replacing null values with calculated value
>>> for i in index:
testdf2['Yearly'][i] = testdf2['Monthly'][i] * testdf2['Tenure'][i]
>>> testdf2
Monthly Tenure Yearly
0 10 1 10.0
1 20 2 40.0
2 30 3 90.0
3 40 4 160.0
4 50 5 250.0
ฉันใช้สิ่งต่อไปนี้แล้วพิมพ์มันลงในสตริงและตรวจสอบค่าน่าน
(str(df.at[index, 'column']) == 'nan')
สิ่งนี้ช่วยให้ฉันสามารถตรวจสอบค่าเฉพาะในซีรีส์และไม่เพียงแค่คืนค่าหากมีอยู่ภายในซีรีย์
pandas.isna()
หรือไม่?
หรือคุณสามารถใช้.info()
กับDF
เช่น:
df.info(null_counts=True)
ซึ่งส่งคืนจำนวนแถวที่ไม่ใช่นัลในคอลัมน์เช่น:
<class 'pandas.core.frame.DataFrame'>
Int64Index: 3276314 entries, 0 to 3276313
Data columns (total 10 columns):
n_matches 3276314 non-null int64
avg_pic_distance 3276314 non-null float64
df.apply(axis=0, func=lambda x : any(pd.isnull(x)))
จะตรวจสอบแต่ละคอลัมน์ว่ามีน่านหรือไม่
เราสามารถดูค่า Null ที่มีอยู่ในชุดข้อมูลโดยสร้าง heatmap โดยใช้heatmap module ของ seaborn
import pandas as pd
import seaborn as sns
dataset=pd.read_csv('train.csv')
sns.heatmap(dataset.isnull(),cbar=False)
คุณไม่สามารถตรวจสอบได้ว่ามี 'NaN' อยู่หรือไม่ แต่รับเปอร์เซ็นต์ของ 'NaN ในแต่ละคอลัมน์โดยใช้ข้อมูลต่อไปนี้
df = pd.DataFrame({'col1':[1,2,3,4,5],'col2':[6,np.nan,8,9,10]})
df
col1 col2
0 1 6.0
1 2 NaN
2 3 8.0
3 4 9.0
4 5 10.0
df.isnull().sum()/len(df)
col1 0.0
col2 0.2
dtype: float64
คุณสามารถรับจำนวนค่าของแต่ละคอลัมน์ในขณะที่ดำเนินการ EDA ของคุณทั้งนี้ขึ้นอยู่กับประเภทของข้อมูลที่คุณจัดการด้วยการตั้งค่า dropna เป็น False
for col in df:
print df[col].value_counts(dropna=False)
ทำงานได้ดีสำหรับตัวแปรเด็ดขาดไม่มากเมื่อคุณมีค่าที่ไม่ซ้ำใคร