के अपने उपयोग को कम values
और as_matrix()
!
पांडा v0.24.0 ने पांडा की वस्तुओं से NumPy सरणियों को प्राप्त करने के लिए दो नए तरीके पेश किए:
to_numpy()
, जिस पर परिभाषित किया गया है Index
, Series,
और DataFrame
वस्तुओं, और
array
, जो केवल Index
और Series
वस्तुओं पर परिभाषित किया गया है ।
यदि आप v0.24 डॉक्स पर जाते हैं .values
, तो आपको एक बड़ी लाल चेतावनी दिखाई देगी जो कहती है:
चेतावनी: हम DataFrame.to_numpy()
इसके बजाय उपयोग करने की सलाह देते हैं ।
V0.24.0 जारी नोटों के इस भाग को देखें , और यह उत्तर दें अधिक जानकारी के लिए ।
पूरे एपीआई में बेहतर स्थिरता की भावना में, एक नई विधि 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 अपडेट
यदि आप पांडा 1.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
) दो GitHub मुद्दों GH19954 और GH23623 के तहत चर्चा के परिणामस्वरूप जोड़ा गया था ।
विशेष रूप से, डॉक्स औचित्य का उल्लेख करते हैं:
[...] इसके साथ .values
यह स्पष्ट नहीं था कि लौटाया गया मूल्य वास्तविक सरणी, इसका कुछ परिवर्तन या पांडा कस्टम सरणियों (जैसे Categorical
) में से एक होगा। उदाहरण के लिए, के साथ PeriodIndex
, .values
एक नया उत्पन्न करता है ndarray
अवधि के लिए हर बार वस्तुओं। [...]
to_numpy
एपीआई की स्थिरता को बेहतर बनाने का लक्ष्य है, जो सही दिशा में एक बड़ा कदम है। .values
वर्तमान संस्करण में पदावनत नहीं किया जाएगा, लेकिन मुझे उम्मीद है कि यह भविष्य में किसी बिंदु पर हो सकता है, इसलिए मैं उपयोगकर्ताओं से आग्रह करूंगा कि जैसे ही आप कर सकते हैं, नए एपीआई की ओर पलायन करें।
अन्य समाधानों की आलोचना
DataFrame.values
असंगत व्यवहार है, जैसा कि पहले ही उल्लेख किया गया है।
DataFrame.get_values()
बस चारों ओर एक आवरण है DataFrame.values
, इसलिए ऊपर कहा गया सब कुछ लागू होता है।
DataFrame.as_matrix()
अब पदावनत है, उपयोग नहीं करते!