कैसे पता लगाएं कि पंडों के डेटाफ्रेम में कौन से कॉलम में कोई NaN मान है


144

एक पंडों के डेटाफ्रेम को देखते हुए संभावित NaN मान यहां और वहां बिखरे हुए हैं:

प्रश्न: मैं कैसे निर्धारित करूं कि किन कॉलमों में NaN मान है? विशेष रूप से, क्या मैं NaNs वाले स्तंभ नामों की सूची प्राप्त कर सकता हूं?


5
df.isna().any()[lambda x: x]मेरे लिए काम करता है
matanster

जवाबों:


249

अद्यतन: पंडों का उपयोग 0.22.0

नए पंडों संस्करणों में नए तरीके 'DataFrame.isna ()' और 'DataFrame.notna ()' हैं।

In [71]: df
Out[71]:
     a    b  c
0  NaN  7.0  0
1  0.0  NaN  4
2  2.0  NaN  4
3  1.0  7.0  0
4  1.0  3.0  9
5  7.0  4.0  9
6  2.0  6.0  9
7  9.0  6.0  4
8  3.0  0.0  9
9  9.0  0.0  1

In [72]: df.isna().any()
Out[72]:
a     True
b     True
c    False
dtype: bool

स्तंभों की सूची के रूप में:

In [74]: df.columns[df.isna().any()].tolist()
Out[74]: ['a', 'b']

उन स्तंभों को चुनने के लिए (जिनमें कम से कम एक NaNमान होता है):

In [73]: df.loc[:, df.isna().any()]
Out[73]:
     a    b
0  NaN  7.0
1  0.0  NaN
2  2.0  NaN
3  1.0  7.0
4  1.0  3.0
5  7.0  4.0
6  2.0  6.0
7  9.0  6.0
8  3.0  0.0
9  9.0  0.0

OLD उत्तर:

Isnull () का उपयोग करने का प्रयास करें :

In [97]: df
Out[97]:
     a    b  c
0  NaN  7.0  0
1  0.0  NaN  4
2  2.0  NaN  4
3  1.0  7.0  0
4  1.0  3.0  9
5  7.0  4.0  9
6  2.0  6.0  9
7  9.0  6.0  4
8  3.0  0.0  9
9  9.0  0.0  1

In [98]: pd.isnull(df).sum() > 0
Out[98]:
a     True
b     True
c    False
dtype: bool

या @root प्रस्तावित क्लीयर संस्करण के रूप में:

In [5]: df.isnull().any()
Out[5]:
a     True
b     True
c    False
dtype: bool

In [7]: df.columns[df.isnull().any()].tolist()
Out[7]: ['a', 'b']

एक सबसेट का चयन करने के लिए - कम से कम एक NaNमूल्य वाले सभी कॉलम :

In [31]: df.loc[:, df.isnull().any()]
Out[31]:
     a    b
0  NaN  7.0
1  0.0  NaN
2  2.0  NaN
3  1.0  7.0
4  1.0  3.0
5  7.0  4.0
6  2.0  6.0
7  9.0  6.0
8  3.0  0.0
9  9.0  0.0

जवाब देने के लिए धन्यवाद! मैं कॉलम नामों की एक सूची प्राप्त करना चाह रहा हूं (मैंने तदनुसार अपना प्रश्न अपडेट किया), क्या आप जानते हैं कि कैसे?
देवरवर

क्या आप शून्य मानों के बजाय एक विशिष्ट मान वाले सभी स्तंभों को चुनने का एक अच्छा तरीका जानते हैं?
gregorio099

1
कोई बात नहीं! Nulls के बजाय मूल्यों के लिए खोज करने के लिए .isnull () .isin (['xxx']) को बदलें:df.columns[df.isin['xxx'].any()].tolist()
gregorio099

@ gregorio099, मैं इसे इस तरह से df.columns[df.eq(search_for_value).any()].tolist()
करूँगा

1
अच्छा जवाब, पहले से ही उखाड़ा हुआ। आइडिया - आप नए कार्यों में जोड़ सकते हैं isna, notna ?
जोजेल

26

आप उपयोग कर सकते हैं df.isnull().sum()। यह सभी कॉलम और प्रत्येक सुविधा के कुल NaN दिखाता है।


9

मुझे एक समस्या थी जहां मुझे स्क्रीन पर नेत्रहीन निरीक्षण करने के लिए कई स्तंभों की आवश्यकता थी, इसलिए एक छोटी सूची यह मानती है कि फिल्टर और रिटर्निंग कॉलम है

nan_cols = [i for i in df.columns if df[i].isnull().any()]

अगर वह किसी के लिए उपयोगी है


4

बड़ी संख्या में कॉलम रखने वाले डेटासेट में यह देखने के लिए बेहतर है कि कितने कॉलम में शून्य मान हैं और कितने नहीं हैं।

print("No. of columns containing null values")
print(len(df.columns[df.isna().any()]))

print("No. of columns not containing null values")
print(len(df.columns[df.notna().all()]))

print("Total no. of columns in the dataframe")
print(len(df.columns))

मेरे डेटाफ्रेम में उदाहरण के लिए इसमें 82 कॉलम थे, जिनमें से 19 में कम से कम एक शून्य मान था।

इसके अलावा, आप स्वतः ही उन कॉल और पंक्तियों को हटा सकते हैं जिनके आधार पर अधिक शून्य मान हैं।
यह वह कोड है जो यह समझदारी से करता है:

df = df.drop(df.columns[df.isna().sum()>len(df.columns)],axis = 1)
df = df.dropna(axis = 0).reset_index(drop=True)

नोट: उपरोक्त कोड आपके सभी अशक्त मूल्यों को हटा देता है। यदि आप शून्य मान चाहते हैं, तो उन्हें पहले संसाधित करें।


2

मैं स्तंभ नामों को मुद्रित करने के लिए कोड की इन तीन पंक्तियों का उपयोग करता हूं जिनमें कम से कम एक शून्य मान होता है:

for column in dataframe:
    if dataframe[column].isnull().any():
       print('{0} has {1} null values'.format(column, dataframe[column].isnull().sum()))

2

इन दोनों को काम करना चाहिए:

df.isnull().sum()
df.isna().sum()

DataFrame तरीके isna()या isnull()पूरी तरह से समान हैं।

नोट : खाली तारों ''को गलत माना जाता है (NA नहीं माना जाता)


1

इसने मेरे लिए काम किया,

1. कम से कम 1 शून्य मान वाले कॉलम प्राप्त करने के लिए। (कॉलम नाम)

data.columns[data.isnull().any()]

2. गणना के साथ कॉलम प्राप्त करने के लिए, कम से कम 1 शून्य मान के साथ।

data[data.columns[data.isnull().any()]].isnull().sum()

[वैकल्पिक] 3. शून्य संख्या का प्रतिशत प्राप्त करने के लिए।

data[data.columns[data.isnull().any()]].isnull().sum() * 100 / data.shape[0]

कई दृष्टिकोण के लिए धन्यवाद!
माइक रैपादास
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.