पंडों या नेम्पी नान की जगह माईसक्लबीडी के साथ उपयोग करने के लिए कोई नहीं


127

मैं एक mysql डेटाबेस का उपयोग कर एक पंसा डेटाफ्रेम (या एक संख्यात्मक सरणी का उपयोग करने के लिए) लिखने की कोशिश कर रहा हूँ। MysqlDB 'नेन' को समझती नहीं है और मेरा डेटाबेस यह कहते हुए एक त्रुटि निकालता है कि नैन फील्ड की सूची में नहीं है। मुझे 'नैन' को एक नो टाइप में बदलने का तरीका खोजने की जरूरत है।

कोई विचार?


2
क्या कोई सेटिंग नहीं है जिसे आप पंडों में बदल सकते हैं ताकि इसे बदले में वापस Noneकिया जा NULLसके nan?
नाथन हेंचि

जवाबों:


194

@bogatron के पास यह अधिकार है, आप इसका उपयोग कर सकते हैं where, यह ध्यान देने योग्य है कि आप इसे देशी तरीके से पांडा में कर सकते हैं:

df1 = df.where(pd.notnull(df), None)

नोट: यह सभी स्तंभों के dtype को बदल देता है object

उदाहरण:

In [1]: df = pd.DataFrame([1, np.nan])

In [2]: df
Out[2]: 
    0
0   1
1 NaN

In [3]: df1 = df.where(pd.notnull(df), None)

In [4]: df1
Out[4]: 
      0
0     1
1  None

नोट: आप dtypeसभी डेटाटाइप्स प्रकारों का उपयोग करने astype, और उसके बाद डेटाफ़्रेम का उपयोग करने की अनुमति देने के लिए डेटाफ़्रेम का पुनरावर्तन नहीं कर सकते हैं fillna:

df1 = df.astype(object).replace(np.nan, 'None')

दुर्भाग्य से न तो यह और न ही उपयोग replace, इस (बंद) मुद्दे को Noneदेखने के साथ काम करता है ।


एक तरफ के रूप में, यह ध्यान देने योग्य है कि अधिकांश उपयोग के मामलों के लिए आपको NaN को किसी के साथ बदलने की आवश्यकता नहीं है, इस प्रश्न को NaN और कोई नहीं पांडा के बीच के अंतर के बारे में देखें ।

हालाँकि, इस विशिष्ट मामले में ऐसा लगता है कि आप ऐसा करते हैं (कम से कम इस उत्तर के समय)।



1
FWIW..this भी कॉलम के dtype को ऑब्जेक्ट में बदल देगा, आप शायद परवाह नहीं करते हैं
जेफ

@Jeff लिंक के लिए धन्यवाद, अजीब तरह से मैं इसे पहले नहीं ढूँढ सका! मुझे लगा कि यह निश्चित रूप से उल्लेख के लायक है, कोई भी अनुमति देने के लिए dtype को बदलना होगा!
एंडी हेडन

Django के साथ डालने से बचने के लिए पहले उपयोग करने के लिए उपयोगी np.nanकिया जा रहा है स्ट्रिंग के लिए परिवर्तित"nan"
shadi

उपयोगी कैवियट। केवल उन स्तंभों के माध्यम से लूप करने के लिए समझ में आता है जो पहले dtypeसे ही हैं objectऔर उन लोगों के लिए करते हैं और आवश्यकतानुसार अन्य प्रकारों को संभालते हैं। आदर्श रूप में, fillna(None)बहुत अच्छा होगा।
विशाल

83
df = df.replace({np.nan: None})

इस गितुब मुद्दे पर श्रेय यहाँ इस लड़के को जाता है ।


3
यह सबसे अच्छा उत्तर है क्योंकि आप df.replace({np.nan: None})एक टेम्प ऑब्जेक्ट के रूप में उपयोग कर सकते हैं
मैट

17

आप बदल सकते हैं nanके साथ Noneअपने numpy सरणी में:

>>> x = np.array([1, np.nan, 3])
>>> y = np.where(np.isnan(x), None, x)
>>> print y
[1.0 None 3.0]
>>> print type(y[1])
<type 'NoneType'>

2
केवल संभावित चिंता का परिवर्तन है dtype, x.dtypeहै dtype('float64'), जबकि y.dtypeहै dtype('object')
Jaime


4

@Andy हेडन के जवाब के लिए बस एक अतिरिक्त:

चूंकि DataFrame.maskइसके विपरीत जुड़वां हैं DataFrame.where, उनके पास बिल्कुल समान हस्ताक्षर हैं लेकिन विपरीत अर्थ के साथ:

  • DataFrame.whereउन मूल्यों को प्रतिस्थापित करने के लिए उपयोगी है जहां स्थिति गलत है
  • DataFrame.maskउन मानों को प्रतिस्थापित करने के लिए उपयोग किया जाता है जहां स्थिति सत्य है

इसलिए इस प्रश्न में, उपयोग df.mask(df.isna(), other=None, inplace=True)करना अधिक सहज हो सकता है।


2

एक और जोड़: गुणक की जगह और स्तंभ के प्रकार को ऑब्जेक्ट से फ्लोट में परिवर्तित करते समय सावधान रहें । यदि आप निश्चित होना चाहते हैं कि आपके 's लागू @ और and-hayden के सुझाव का उपयोग करने के साथ Noneवापस फ्लिप नहीं होगा । प्रतिस्थापन की व्याख्या अभी भी 'गलत' कैसे हो सकती है:np.NaNpd.where

In [1]: import pandas as pd

In [2]: import numpy as np

In [3]: df = pd.DataFrame({"a": [1, np.NAN, np.inf]})

In [4]: df
Out[4]:
     a
0  1.0
1  NaN
2  inf

In [5]: df.replace({np.NAN: None})
Out[5]:
      a
0     1
1  None
2   inf

In [6]: df.replace({np.NAN: None, np.inf: None})
Out[6]:
     a
0  1.0
1  NaN
2  NaN

In [7]: df.where((pd.notnull(df)), None).replace({np.inf: None})
Out[7]:
     a
0  1.0
1  NaN
2  NaN

इसे जोड़ने के लिए धन्यवाद। फिर से प्रलेखन पर जा रहा है, मैं अभी भी इस व्यवहार को समझ नहीं सकता। वैसे भी, यह अभी तक एक और .replace({np.nan: None})
चीज के साथ

1
हां, आप दूसरे को जोड़कर समाप्त कर सकते हैं replace({np.nan: None})। मेरी टिप्पणी संभावित ख़राबियों को इंगित करने के लिए जोड़ा गया था जब प्रतिस्थापित किया जा रहा है np.nan। ऊपर निश्चित रूप से मुझे एक बिट के लिए बाहर निकाल दिया!
gaatjeniksaan

1

काफी पुरानी है, फिर भी मैं एक ही मुद्दे पर ठोकर खाई। ऐसा करने का प्रयास करें:

df['col_replaced'] = df['col_with_npnans'].apply(lambda x: None if np.isnan(x) else x)

कॉलम डेटा प्रकार संख्यात्मक होने के कारण काम नहीं करता है क्योंकि कोई भी बस वापस नैनो में परिवर्तित नहीं होता है (पांडा 0.23)
shadi
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.