আপনার valuesএবং ব্যবহারের অবমূল্যায়ন করুন as_matrix()!
পান্ডাস ভি0.২৪.০ প্যান্ডাস অবজেক্ট থেকে নুমপি অ্যারে প্রাপ্ত করার জন্য দুটি নতুন পদ্ধতি চালু করেছে:
to_numpy(), যা সংজ্ঞায়িত করা হয় Index, Series,এবং DataFrameঅবজেক্টস এবং
array, যা সংজ্ঞায়িত করা হয় Indexএবং Seriesকেবল বস্তুগুলি।
আপনি যদি v0.24 ডক্সের জন্য যান তবে .valuesআপনি একটি বড় লাল সতর্কতা দেখতে পাবেন যা এতে বলে:
সতর্কতা: আমরা DataFrame.to_numpy()পরিবর্তে ব্যবহার করার পরামর্শ দিই ।
দেখুন v0.24.0 রিলিজ নোট এই অ w শটি এবং এই উত্তরটি আরও তথ্যের জন্য।
আরও ভাল ধারাবাহিকতার দিকে: to_numpy()
এপিআই জুড়ে আরও ভাল ধারাবাহিকতার চেতনায় to_numpyডেটা ফ্রেমগুলি থেকে অন্তর্নিহিত নুমপি অ্যারেটি বের করার জন্য একটি নতুন পদ্ধতি চালু করা হয়েছে।
# Setup.
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]}, index=['a', 'b', 'c'])
df.to_numpy()
array([[1, 4],
[2, 5],
[3, 6]])
উপরে উল্লিখিত হিসাবে, এই পদ্ধতিটি Indexএবং Seriesঅবজেক্টগুলিতে ( এখানে দেখুন ) সংজ্ঞায়িতও করা হয় ।
df.index.to_numpy()
# array(['a', 'b', 'c'], dtype=object)
df['A'].to_numpy()
# array([1, 2, 3])
ডিফল্টরূপে, একটি দৃশ্য ফিরে আসে, সুতরাং যে কোনও পরিবর্তনগুলি আসলটিকে প্রভাবিত করে।
v = df.to_numpy()
v[0, 0] = -1
df
A B
a -1 4
b 2 5
c 3 6
পরিবর্তে আপনার যদি একটি অনুলিপি প্রয়োজন হয়, ব্যবহার করুন to_numpy(copy=True)।
এক্সটেনশনটাইপগুলির জন্য প্যান্ডাস> = 1.0 আপডেট
আপনি যদি পান্ডাস ১.x ব্যবহার করছেন তবে সম্ভাবনা হ'ল আপনি এক্সটেনশনের ধরণের সাথে আরও অনেক কিছু করছেন। এই এক্সটেনশন ধরণেরগুলি সঠিকভাবে রূপান্তরিত হয়েছে সে সম্পর্কে আপনাকে আরও কিছুটা যত্নবান হতে হবে।
a = pd.array([1, 2, None], dtype="Int64")
a
<IntegerArray>
[1, 2, <NA>]
Length: 3, dtype: Int64
# Wrong
a.to_numpy()
# array([1, 2, <NA>], dtype=object) # yuck, objects
# Right
a.to_numpy(dtype='float', na_value=np.nan)
# array([ 1., 2., nan])
এটি ডক্সে আউট বলা হয় ।
আপনার যদি প্রয়োজন হয় dtypes...
অন্য উত্তরে দেখানো হয়েছে, DataFrame.to_recordsএটি করার একটি ভাল উপায়।
df.to_records()
# rec.array([('a', -1, 4), ('b', 2, 5), ('c', 3, 6)],
# dtype=[('index', 'O'), ('A', '<i8'), ('B', '<i8')])
to_numpyদুর্ভাগ্যক্রমে এটি করা যায় না । তবে, বিকল্প হিসাবে, আপনি ব্যবহার করতে পারেন np.rec.fromrecords:
v = df.reset_index()
np.rec.fromrecords(v, names=v.columns.tolist())
# rec.array([('a', -1, 4), ('b', 2, 5), ('c', 3, 6)],
# dtype=[('index', '<U1'), ('A', '<i8'), ('B', '<i8')])
পারফরম্যান্স অনুসারে, এটি প্রায় একই (আসলে, rec.fromrecordsব্যবহারটি কিছুটা দ্রুত)।
df2 = pd.concat([df] * 10000)
%timeit df2.to_records()
%%timeit
v = df2.reset_index()
np.rec.fromrecords(v, names=v.columns.tolist())
11.1 ms ± 557 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
9.67 ms ± 126 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
একটি নতুন পদ্ধতি যুক্ত করার যুক্তি
to_numpy()(অতিরিক্ত arrayহিসাবে) দুটি গিটহাব ইস্যু GH19954 এবং GH23623 এর অধীনে আলোচনার ফলাফল হিসাবে যুক্ত করা হয়েছিল ।
বিশেষত, দস্তাবেজগুলি যুক্তিটি উল্লেখ করে:
[...] এর সাথে .valuesএটি স্পষ্ট নয় যে প্রত্যাবর্তিত মানটি আসল অ্যারে, এর কিছু রূপান্তর বা প্যান্ডাস কাস্টম অ্যারেগুলির মধ্যে (যেমন Categorical) হবে। উদাহরণস্বরূপ, সঙ্গে PeriodIndex, .values
একটি নতুন জেনারেট করে ndarrayযুগের প্রতিটি সময় অবজেক্ট। [...]
to_numpyএপিআই-র ধারাবাহিকতা উন্নত করার লক্ষ্যে, যা সঠিক দিকের একটি বড় পদক্ষেপ। .valuesবর্তমান সংস্করণে হ্রাস করা হবে না, তবে আমি প্রত্যাশা করি এটি ভবিষ্যতে কোনও সময়ে ঘটতে পারে, তাই আমি ব্যবহারকারীদের যত তাড়াতাড়ি সম্ভব নতুন এপিআই-তে অভিবাসন করার জন্য অনুরোধ করব।
অন্যান্য সমাধানের সমালোচনা
DataFrame.values যেমনটি ইতিমধ্যে উল্লিখিত হিসাবে বেমানান আচরণ রয়েছে।
DataFrame.get_values()কেবল চারপাশে কেবল একটি মোড়ক DataFrame.values, তাই উপরে যা বলেছে তা প্রযোজ্য।
DataFrame.as_matrix()এখন অবচয় করা হয়েছে, ব্যবহার করবেন না !