.any()
và .all()
rất tốt cho các trường hợp cực đoan, nhưng không phải khi bạn đang tìm kiếm một số giá trị null cụ thể. Đây là một cách cực kỳ đơn giản để làm những gì tôi tin rằng bạn đang yêu cầu. Nó khá dài dòng, nhưng đầy đủ chức năng.
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))
Đầu ra
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]
Sau đó, nếu bạn giống tôi và muốn xóa những hàng đó, bạn chỉ cần viết điều này:
# 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)
Đầu ra:
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)]
làm việc nhưng némUserWarning: Boolean Series key will be reindexed to match DataFrame index.
. Làm thế nào để người ta viết lại điều này rõ ràng hơn và theo cách không kích hoạt thông điệp cảnh báo đó?