.any()
และ.all()
ยอดเยี่ยมสำหรับกรณีร้ายแรง แต่ไม่ใช่เมื่อคุณกำลังค้นหาค่า Null จำนวนหนึ่ง นี่เป็นวิธีที่ง่ายที่สุดในการทำสิ่งที่ฉันเชื่อว่าคุณกำลังขอ มันค่อนข้างละเอียด แต่ใช้งานได้
import pandas as pd
import numpy as np
# Some test data frame
df = pd.DataFrame({'num_legs': [2, 4, np.nan, 0, np.nan],
'num_wings': [2, 0, np.nan, 0, 9],
'num_specimen_seen': [10, np.nan, 1, 8, np.nan]})
# Helper : Gets NaNs for some row
def row_nan_sums(df):
sums = []
for row in df.values:
sum = 0
for el in row:
if el != el: # np.nan is never equal to itself. This is "hacky", but complete.
sum+=1
sums.append(sum)
return sums
# Returns a list of indices for rows with k+ NaNs
def query_k_plus_sums(df, k):
sums = row_nan_sums(df)
indices = []
i = 0
for sum in sums:
if (sum >= k):
indices.append(i)
i += 1
return indices
# test
print(df)
print(query_k_plus_sums(df, 2))
เอาท์พุต
num_legs num_wings num_specimen_seen
0 2.0 2.0 10.0
1 4.0 0.0 NaN
2 NaN NaN 1.0
3 0.0 0.0 8.0
4 NaN 9.0 NaN
[2, 4]
จากนั้นหากคุณเป็นเหมือนฉันและต้องการล้างแถวเหล่านั้นออกไปคุณแค่เขียนสิ่งนี้:
# drop the rows from the data frame
df.drop(query_k_plus_sums(df, 2),inplace=True)
# Reshuffle up data (if you don't do this, the indices won't reset)
df = df.sample(frac=1).reset_index(drop=True)
# print data frame
print(df)
เอาท์พุท:
num_legs num_wings num_specimen_seen
0 4.0 0.0 NaN
1 0.0 0.0 8.0
2 2.0 2.0 10.0
df[df.isnull().any(axis=1)]
ทำงานUserWarning: Boolean Series key will be reindexed to match DataFrame index.
แต่พ่น เราจะเขียนสิ่งนี้อย่างชัดเจนมากขึ้นและในวิธีที่ไม่เรียกข้อความเตือนนั้นได้อย่างไร