পান্ডা বা নম্পি নানকে মাইএসকিএলডিবি-র সাথে ব্যবহার করার জন্য কারও সাথে প্রতিস্থাপন করা


127

আমি মাইএসকিএলডিবি ব্যবহার করে একটি মাইএসকিএল ডাটাবেসে একটি পান্ডাস ডেটাফ্রেম (বা একটি নমপি অ্যারে ব্যবহার করতে পারি) লেখার চেষ্টা করছি। মাইএসকিএলডিবি 'নান' বোঝে বলে মনে হয় না এবং আমার ডাটাবেসটি ত্রুটি করে বলেছে যে নান ফিল্ড তালিকায় নেই। 'নান' কে ননটাইপ রূপান্তর করার জন্য আমার একটি উপায় খুঁজে বের করতে হবে।

কোন ধারনা?


2
কোন সেটিংস আপনাকে পান্ডাস পরিবর্তন করতে পারেন তা ফেরত করা হয় Noneজন্য NULLপরিবর্তে nan?
নাথান হিঙ্কে

উত্তর:


194

@ বোগাট্রনের ঠিক আছে, আপনি এটি ব্যবহার করতে পারেন 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 প্রতিস্থাপন করতে হবে না, পান্ডে নাএন এবং কোনওটির মধ্যে পার্থক্য সম্পর্কে এই প্রশ্নটি দেখুন ।

তবে, এই নির্দিষ্ট ক্ষেত্রে মনে হয় আপনি করছেন (কমপক্ষে এই উত্তরের সময়) of



1
এফডব্লিউআইডাব্লিউ..এটি কলামগুলির ধরণের ধরণটিকেও আপত্তিতে পরিবর্তন করে দেবে, আপনি সম্ভবত পাত্তা দিচ্ছেন না
জেফ

@ জেফ এই লিঙ্কটির জন্য ধন্যবাদ, আজবভাবে আমি এটির আগে খুঁজে পাইনি! আমি অনুভব করেছি যে এটির জন্য dtype পরিবর্তন করতে হবে কারওই অনুমতি নেই, অবশ্যই উল্লেখ করার মতো!
অ্যান্ডি হেডেন

জ্যাঙ্গো সঙ্গে ঢোকাতে এড়াতে আগেই ব্যবহারে দরকারী np.nanহচ্ছে স্ট্রিং রূপান্তর"nan"
দয়া

দরকারী সাবধান। কেবলমাত্র সেই কলাম যে ইতিমধ্যেই আছে মাধ্যেমে লুপ জ্ঞান করে তোলে dtypeএর objectএবং যারা জন্য এটা করতে এবং ভিন্নভাবে অন্যান্য প্রকার পরিচালনা হিসাবে প্রয়োজন। আদর্শভাবে, fillna(None)ভয়ঙ্কর হবে।
বিশাল


17

আপনি আপনার নাম্বার অ্যারে nanদিয়ে প্রতিস্থাপন করতে পারেন None:

>>> 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')
জাইমে

10

চারপাশে হোঁচট খাওয়ার পরে, এটি আমার পক্ষে কাজ করেছে:

df = df.astype(object).where(pd.notnull(df),None)

4

@ অ্যান্ডি হ্যাডেনের উত্তরে কেবল একটি সংযোজন:

যেহেতু DataFrame.maskবিপরীত যমজ DataFrame.where, সুতরাং তাদের ঠিক একই স্বাক্ষর রয়েছে তবে বিপরীত অর্থ সহ:

  • DataFrame.whereশর্তটি মিথ্যা যেখানে মানগুলি প্রতিস্থাপনের জন্য দরকারী
  • DataFrame.maskশর্তটি সত্য যেখানে মানগুলি প্রতিস্থাপনের জন্য ব্যবহৃত হয় ।

সুতরাং এই প্রশ্নে, ব্যবহার df.mask(df.isna(), other=None, inplace=True)করা আরও স্বজ্ঞাত হতে পারে।


2

আরেকটি সংযোজন: গুণগুলি প্রতিস্থাপন এবং কলামের ধরণটিকে বস্তু থেকে ফ্লোটে রূপান্তর করার সময় সতর্কতা অবলম্বন করুন । আপনি যদি নিশ্চিত হতে চান যে আপনার ব্যবহারগুলি @ অ্যান্ডি-হেডেনের পরামর্শ ব্যবহারের ক্ষেত্রে 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। উপরেরটি অবশ্যই আমাকে কিছুটা ছড়িয়ে দিয়েছে!
গাটজিনিকসন

1

বেশ পুরানো, তবুও আমি একই সমস্যা নিয়ে হোঁচট খেয়েছি। এটি করার চেষ্টা করুন:

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

যদি কলাম ডাটা টাইপ সাংখ্যিক কাজ করে না কারণ কোনটি ঠিক নান মধ্যে রূপান্তরিত ফিরে (পান্ডাস 0.23) পায়
দয়া
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.