পান্ডাস ডেটা ফ্রেমকে নুমপি অ্যারে রূপান্তর করুন


465

আমি কীভাবে একটি পান্ডাস ডেটা ফ্রেমকে নুমপি অ্যারে রূপান্তর করতে পারি তা জানতে আগ্রহী।

dataframe:

import numpy as np
import pandas as pd

index = [1, 2, 3, 4, 5, 6, 7]
a = [np.nan, np.nan, np.nan, 0.1, 0.1, 0.1, 0.1]
b = [0.2, np.nan, 0.2, 0.2, 0.2, np.nan, np.nan]
c = [np.nan, 0.5, 0.5, np.nan, 0.5, 0.5, np.nan]
df = pd.DataFrame({'A': a, 'B': b, 'C': c}, index=index)
df = df.rename_axis('ID')

দেয়

label   A    B    C
ID                                 
1   NaN  0.2  NaN
2   NaN  NaN  0.5
3   NaN  0.2  0.5
4   0.1  0.2  NaN
5   0.1  0.2  0.5
6   0.1  NaN  0.5
7   0.1  NaN  NaN

আমি এটি একটি NumPy অ্যারে রূপান্তর করতে চাই, তাই:

array([[ nan,  0.2,  nan],
       [ nan,  nan,  0.5],
       [ nan,  0.2,  0.5],
       [ 0.1,  0.2,  nan],
       [ 0.1,  0.2,  0.5],
       [ 0.1,  nan,  0.5],
       [ 0.1,  nan,  nan]])

কিভাবে আমি এটি করতে পারব?


বোনাস হিসাবে, এটি কি টাইপগুলি সংরক্ষণ করা সম্ভব?

array([[ 1, nan,  0.2,  nan],
       [ 2, nan,  nan,  0.5],
       [ 3, nan,  0.2,  0.5],
       [ 4, 0.1,  0.2,  nan],
       [ 5, 0.1,  0.2,  0.5],
       [ 6, 0.1,  nan,  0.5],
       [ 7, 0.1,  nan,  nan]],
     dtype=[('ID', '<i4'), ('A', '<f8'), ('B', '<f8'), ('B', '<f8')])

অথবা সাদৃশ্যপূর্ণ?


5
আপনার এটার দরকার কেন? যাইহোক নামী অ্যারেগুলির উপর ভিত্তি করে ডেটাফ্রেমগুলি নেই? আপনার কোনও ডেফ্রেম ব্যবহার করতে সক্ষম হবেন যেখানে আপনাকে একটি নমপি অ্যারে প্রয়োজন। এজন্য আপনি সাইকিট-শিখার সাথে ডেটাফ্রেমগুলি ব্যবহার করতে পারেন যেখানে ফাংশনগুলি ন্যালি অ্যারেগুলির জন্য জিজ্ঞাসা করে।
chrisfs

(1): এখানে dtypes & recarrays (ওরফে রেকর্ড বিন্যাস বা কাঠামোবদ্ধ অ্যারে) সম্পর্কে সম্ভবত প্রাসঙ্গিক লিঙ্কগুলির একটি দম্পতি আছে stackoverflow.com/questions/9949427/... (2) stackoverflow.com/questions/52579601/...
JohnE

দ্রষ্টব্য: পান্ডাস ডেটাফ্রেমকে এ জাতীয় (বা তালিকা) এর মতো রূপান্তরিত করা অন্যান্য সমস্যার ইঙ্গিত দিতে পারে। আপনার দৃ strongly় ব্যবহারের ক্ষেত্রে ডেটা ফ্রেমই উপযুক্ত ডেটা কাঠামো, এবং আপনার আগ্রহী অপারেশনগুলি সম্পাদন করার কোনও উপায় পান্ডাদের অন্তর্ভুক্ত নয় তা নিশ্চিত করার জন্য আমি দৃ strongly়ভাবে সুপারিশ করছি
এএমসি

উত্তর:


390

একটি পান্ডাস ডেটা ফ্রেম (ডিএফ) কে একটি নিম্পী নাদার্রে রূপান্তর করতে, এই কোডটি ব্যবহার করুন:

df.values

array([[nan, 0.2, nan],
       [nan, nan, 0.5],
       [nan, 0.2, 0.5],
       [0.1, 0.2, nan],
       [0.1, 0.2, 0.5],
       [0.1, nan, 0.5],
       [0.1, nan, nan]])

236

আপনার valuesএবং ব্যবহারের অবমূল্যায়ন করুন as_matrix()!

পান্ডাস ভি0.২৪.০ প্যান্ডাস অবজেক্ট থেকে নুমপি অ্যারে প্রাপ্ত করার জন্য দুটি নতুন পদ্ধতি চালু করেছে:

  1. to_numpy(), যা সংজ্ঞায়িত করা হয় Index, Series,এবং DataFrameঅবজেক্টস এবং
  2. 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()এখন অবচয় করা হয়েছে, ব্যবহার করবেন না !


আমি বুঝতে পারছি না যে পৃষ্ঠাগুলির পরে লোকেরা তাদের ফুসফুসের শীর্ষে চিৎকার করে as_matrixঅন্য কোনও সমাধানে স্যুইচ করার জন্য পৃষ্ঠার পরে কীভাবে পৃষ্ঠা পড়তে পারে, এই ক্ষেত্রে, to_numpyকলামটি নির্বাচন করে কার্যকারিতাটি কীভাবে পুনরুদ্ধার করবেন তা ব্যাখ্যা না করে as_matrix! আমি নিশ্চিত কলামগুলি নির্বাচন করার অন্যান্য উপায় আছে তবে সেগুলির as_matrixমধ্যে অন্তত একটি ছিল!
জেরেমি

@ জুরমিও স্পষ্টতই ছাড়াও df[[col1, col2']].to_numpy()? নিশ্চিত নন যে আপনি কেন অবহেলিত ফাংশনটির আপডেট হওয়া বিকল্পের বিজ্ঞাপনের উত্তরটির ডাউন ডাউনকে সতর্ক করে দেন।
সিএস 95

কি কি কিছু কলাম তালিকা টাইপ হয়। এর থেকে আমি কীভাবে একটি ফ্ল্যাট অগভীর অ্যারে তৈরি করতে পারি?
মনিবা 26'19

@ মনিবা আপনি প্রথমে আপনার প্রয়োজন অনুসারে তালিকা আইটেমগুলি পৃথক কলাম / সারিগুলিতে বিস্ফোরণ করতে পারেন।
cs95

আমি ভুল না হলে একই কলে একাধিক কলাম পেয়ে সমস্ত ডেটা একটি বড় অ্যারেতে মিশে যায়। আমি কিছু অনুপস্থিত করছি?
আন্ড্রেয়া মোরো

128

দ্রষ্টব্য : .as_matrix()এই উত্তরে ব্যবহৃত পদ্ধতিটি অবচয় করা হয়েছে। পান্ডাস 0.23.4 সতর্ক করেছে:

পদ্ধতিটি .as_matrixভবিষ্যতের সংস্করণে সরানো হবে। পরিবর্তে। মূল্যগুলি ব্যবহার করুন।


পান্ডাসের মধ্যে কিছু নির্মিত হয়েছে ...

numpy_matrix = df.as_matrix()

দেয়

array([[nan, 0.2, nan],
       [nan, nan, 0.5],
       [nan, 0.2, 0.5],
       [0.1, 0.2, nan],
       [0.1, 0.2, 0.5],
       [0.1, nan, 0.5],
       [0.1, nan, nan]])

30
এটি কোনও কাঠামোগত অ্যারে দেয় না, সমস্ত কলামগুলি টাইপযুক্ত object
sebix

14
"সংস্করণ 0.23.0 থেকে অবহেলিত: পরিবর্তে ডেটা ফ্রেম.ভ্যালুগুলি ব্যবহার করুন" " / "এই পদ্ধতিটি পিছনের সামঞ্জস্যের জন্য সরবরাহ করা হয় General সাধারণত, এটি '। মূল্যবোধ' ব্যবহার করার পরামর্শ দেওয়া হয়।" - github.com/pandas-dev/pandas/blob/…
ডেভিড জে

4
এটি এখন অবচয় করা হয়েছে। V0.24 এর পরে, দয়া করে to_numpyপরিবর্তে ব্যবহার করুন ( .valuesহয় না )। আরও এখানে
সিএস 95

1
"ফিউচার ওয়ার্নিং: পদ্ধতি .as_matrix ভবিষ্যতের সংস্করণে সরানো হবে instead পরিবর্তে। মূল্যবোধ ব্যবহার করুন।"
ফরহাদ মালেকি

66

আমি ইনডেক্স সহ ডেটাফ্রেমের নম্পি প্রতিনিধিত্ব পেতে কেবল ডেটা ফ্রেম.রেসেট_ইন্ডেক্স () এবং ডেটাফ্রেম.মূল্য ফাংশনগুলিকে শৃঙ্খলিত করব:

In [8]: df
Out[8]: 
          A         B         C
0 -0.982726  0.150726  0.691625
1  0.617297 -0.471879  0.505547
2  0.417123 -1.356803 -1.013499
3 -0.166363 -0.957758  1.178659
4 -0.164103  0.074516 -0.674325
5 -0.340169 -0.293698  1.231791
6 -1.062825  0.556273  1.508058
7  0.959610  0.247539  0.091333

[8 rows x 3 columns]

In [9]: df.reset_index().values
Out[9]:
array([[ 0.        , -0.98272574,  0.150726  ,  0.69162512],
       [ 1.        ,  0.61729734, -0.47187926,  0.50554728],
       [ 2.        ,  0.4171228 , -1.35680324, -1.01349922],
       [ 3.        , -0.16636303, -0.95775849,  1.17865945],
       [ 4.        , -0.16410334,  0.0745164 , -0.67432474],
       [ 5.        , -0.34016865, -0.29369841,  1.23179064],
       [ 6.        , -1.06282542,  0.55627285,  1.50805754],
       [ 7.        ,  0.95961001,  0.24753911,  0.09133339]])

ডাইপগুলি পেতে আমাদের এই নাদার্রে ভিউ ব্যবহার করে কাঠামোগত অ্যারে রূপান্তর করতে হবে :

In [10]: df.reset_index().values.ravel().view(dtype=[('index', int), ('A', float), ('B', float), ('C', float)])
Out[10]:
array([( 0, -0.98272574,  0.150726  ,  0.69162512),
       ( 1,  0.61729734, -0.47187926,  0.50554728),
       ( 2,  0.4171228 , -1.35680324, -1.01349922),
       ( 3, -0.16636303, -0.95775849,  1.17865945),
       ( 4, -0.16410334,  0.0745164 , -0.67432474),
       ( 5, -0.34016865, -0.29369841,  1.23179064),
       ( 6, -1.06282542,  0.55627285,  1.50805754),
       ( 7,  0.95961001,  0.24753911,  0.09133339),
       dtype=[('index', '<i8'), ('A', '<f8'), ('B', '<f8'), ('C', '<f8')])

3
এই উত্তরের একমাত্র জিনিস অনুপস্থিত তা হ'ল কীভাবে ডেটা ফ্রেম থেকে dtype তৈরি করা যায় যাতে আপনি একটি জেনেরিক ফাংশন লিখতে পারেন
জোসেফ গারভিন

32

আপনি to_recordsপদ্ধতিটি ব্যবহার করতে পারেন তবে ডাইটিপসের সাথে কিছুটা খেলতে হবে যদি সেগুলি আপনি যেতে চান না তবে সেগুলি করুন। আমার ক্ষেত্রে, আপনার ডিএফ একটি স্ট্রিং থেকে অনুলিপি করার পরে, সূচী টাইপটি স্ট্রিং ( objectপ্যান্ডাসের কোনও টাইপ দ্বারা উপস্থাপিত ):

In [102]: df
Out[102]: 
label    A    B    C
ID                  
1      NaN  0.2  NaN
2      NaN  NaN  0.5
3      NaN  0.2  0.5
4      0.1  0.2  NaN
5      0.1  0.2  0.5
6      0.1  NaN  0.5
7      0.1  NaN  NaN

In [103]: df.index.dtype
Out[103]: dtype('object')
In [104]: df.to_records()
Out[104]: 
rec.array([(1, nan, 0.2, nan), (2, nan, nan, 0.5), (3, nan, 0.2, 0.5),
       (4, 0.1, 0.2, nan), (5, 0.1, 0.2, 0.5), (6, 0.1, nan, 0.5),
       (7, 0.1, nan, nan)], 
      dtype=[('index', '|O8'), ('A', '<f8'), ('B', '<f8'), ('C', '<f8')])
In [106]: df.to_records().dtype
Out[106]: dtype([('index', '|O8'), ('A', '<f8'), ('B', '<f8'), ('C', '<f8')])

পুনঃনির্মাণটি টাইপ রূপান্তর করা আমার পক্ষে কাজ করে না তবে পান্ডসে ইতিমধ্যে কেউ এটি করতে পারেন:

In [109]: df.index = df.index.astype('i8')
In [111]: df.to_records().view([('ID', '<i8'), ('A', '<f8'), ('B', '<f8'), ('C', '<f8')])
Out[111]:
rec.array([(1, nan, 0.2, nan), (2, nan, nan, 0.5), (3, nan, 0.2, 0.5),
       (4, 0.1, 0.2, nan), (5, 0.1, 0.2, 0.5), (6, 0.1, nan, 0.5),
       (7, 0.1, nan, nan)], 
      dtype=[('ID', '<i8'), ('A', '<f8'), ('B', '<f8'), ('C', '<f8')])

নোট করুন যে পান্ডস IDরফতানি রেকর্ড অ্যারে (একটি বাগ?) তে সূচকের নামটি সঠিকভাবে (থেকে ) সেট করে না , তাই আমরা এটির জন্য সংশোধন টাইপ থেকেও লাভ করি।

এই মুহুর্তে পান্ডার কাছে কেবল 8-বাইট পূর্ণসংখ্যা i8এবং ভাসমান f8(এই সমস্যাটি দেখুন )।


2
চাওয়া-পাওয়া স্ট্রাকচার্ড অ্যারে পেতে (যার একটি পুনঃনির্মাণের চেয়ে ভাল পারফরম্যান্স রয়েছে) আপনি কেবল কনস্ট্রাক্টরের কাছে পুনঃনির্মাণটি পাস করেন np.array
উল্কি

উপরে বর্ণিত সূচকের নাম নির্ধারণের জন্য আমরা কেবল একটি স্থিরতা রেখেছি।
চ্যাং সে

26

দেখে মনে df.to_records()হচ্ছে আপনার পক্ষে কাজ করবে। আপনি যে সঠিক বৈশিষ্ট্যটি সন্ধান করছেন সেটি অনুরোধ করা হয়েছিল এবং to_recordsবিকল্প হিসাবে চিহ্নিত করা হয়েছিল।

আমি স্থানীয়ভাবে আপনার উদাহরণটি ব্যবহার করে এটি ব্যবহার করে দেখেছি এবং সেই কলটি আপনি যে আউটপুটটি সন্ধান করছেন তার সাথে খুব মিল কিছু পাওয়া যায়:

rec.array([(1, nan, 0.2, nan), (2, nan, nan, 0.5), (3, nan, 0.2, 0.5),
       (4, 0.1, 0.2, nan), (5, 0.1, 0.2, 0.5), (6, 0.1, nan, 0.5),
       (7, 0.1, nan, nan)],
      dtype=[(u'ID', '<i8'), (u'A', '<f8'), (u'B', '<f8'), (u'C', '<f8')])

মনে রাখবেন, এই একটি হল recarrayএকটি বদলে array। আপনি ফলাফলটিকে নিয়মিত নিমপী অ্যারে হিসাবে এর কনস্ট্রাক্টরকে কল করে সরিয়ে নিতে পারেন np.array(df.to_records())


3
অপেক্ষা করুন, এই উত্তরটি উত্তরটির তুলনায় to_records()5 বছরেরও বেশি আগে উল্লিখিত উত্তরটির তুলনায় কী যুক্ত করবে ?
জন

13

এটা চেষ্টা কর:

a = numpy.asarray(df)

ওহে! আপনার উত্তরে দয়া করে কিছু ব্যাখ্যা যুক্ত করুন। এখনই, এটি দৈর্ঘ্য এবং সামগ্রীর কারণে পর্যালোচনা করে নিম্ন মানের হিসাবে চিহ্নিত করা হচ্ছে এবং সিস্টেম দ্বারা মুছে ফেলার ঝুঁকিতে রয়েছে। ধন্যবাদ!
d_kennetz

1
মূলত ইনপুটটিকে একটি অ্যারেতে রূপান্তর করুন (নামটি যেমন বোঝায়)। সুতরাং প্রশ্নের প্রসঙ্গের পাশাপাশি, এই উত্তরটি বৈধ। docs.scipy.org/doc/numpy/references/generated/…
Lautaro Parada

ধন্যবাদ, আমি মনে করি এটি একরকম স্ব-ব্যাখ্যামূলক।
দাদু খান

8

একটি পান্ডাস ডেটা ফ্রেম থেকে কাঠামোর অ্যারে তৈরি করার জন্য আমার পদ্ধতির বিষয়টি এখানে।

ডেটা ফ্রেম তৈরি করুন

import pandas as pd
import numpy as np
import six

NaN = float('nan')
ID = [1, 2, 3, 4, 5, 6, 7]
A = [NaN, NaN, NaN, 0.1, 0.1, 0.1, 0.1]
B = [0.2, NaN, 0.2, 0.2, 0.2, NaN, NaN]
C = [NaN, 0.5, 0.5, NaN, 0.5, 0.5, NaN]
columns = {'A':A, 'B':B, 'C':C}
df = pd.DataFrame(columns, index=ID)
df.index.name = 'ID'
print(df)

      A    B    C
ID               
1   NaN  0.2  NaN
2   NaN  NaN  0.5
3   NaN  0.2  0.5
4   0.1  0.2  NaN
5   0.1  0.2  0.5
6   0.1  NaN  0.5
7   0.1  NaN  NaN

একটি পান্ডাস ডেটা ফ্রেম থেকে একটি নম্পি কাঠামোর অ্যারে (রেকর্ড অ্যারে নয়) তৈরি করার জন্য ফাংশনটি সংজ্ঞায়িত করুন।

def df_to_sarray(df):
    """
    Convert a pandas DataFrame object to a numpy structured array.
    This is functionally equivalent to but more efficient than
    np.array(df.to_array())

    :param df: the data frame to convert
    :return: a numpy structured array representation of df
    """

    v = df.values
    cols = df.columns

    if six.PY2:  # python 2 needs .encode() but 3 does not
        types = [(cols[i].encode(), df[k].dtype.type) for (i, k) in enumerate(cols)]
    else:
        types = [(cols[i], df[k].dtype.type) for (i, k) in enumerate(cols)]
    dtype = np.dtype(types)
    z = np.zeros(v.shape[0], dtype)
    for (i, k) in enumerate(z.dtype.names):
        z[k] = v[:, i]
    return z

reset_indexএকটি নতুন ডেটা ফ্রেম তৈরি করতে ব্যবহার করুন যাতে এর ডেটার অংশ হিসাবে সূচকটি অন্তর্ভুক্ত করে। সেই ডেটা ফ্রেমকে একটি কাঠামোর অ্যারেতে রূপান্তর করুন।

sa = df_to_sarray(df.reset_index())
sa

array([(1L, nan, 0.2, nan), (2L, nan, nan, 0.5), (3L, nan, 0.2, 0.5),
       (4L, 0.1, 0.2, nan), (5L, 0.1, 0.2, 0.5), (6L, 0.1, nan, 0.5),
       (7L, 0.1, nan, nan)], 
      dtype=[('ID', '<i8'), ('A', '<f8'), ('B', '<f8'), ('C', '<f8')])

সম্পাদনা: পাইথন দিয়ে .encode () কল করতে ত্রুটি এড়ানোর জন্য df_to_sarray আপডেট করা হয়েছে 3. জোসেফ গারভিন এবং হ্যালসিওন তাদের মন্তব্য এবং সমাধানের জন্য ধন্যবাদ ।


আমার জন্য কাজ করে না, ত্রুটি: প্রকারের ত্রুটি: ডেটা টাইপ বোঝা যায় নি
জোসেফ গারভিন

আপনার মন্তব্য এবং সংশোধনের জন্য halcyon ধন্যবাদ। আমি আমার উত্তর আপডেট করেছি তাই আমি আশা করি এটি এখন আপনার জন্য কাজ করে।
ফিল


5

উদাহরণস্বরূপ ডেটা ফ্রেমের সহজ উপায়:

df

         gbm       nnet        reg
0  12.097439  12.047437  12.100953
1  12.109811  12.070209  12.095288
2  11.720734  11.622139  11.740523
3  11.824557  11.926414  11.926527
4  11.800868  11.727730  11.729737
5  12.490984  12.502440  12.530894

ব্যবহার:

np.array(df.to_records().view(type=np.matrix))

পাওয়া:

array([[(0, 12.097439  , 12.047437, 12.10095324),
        (1, 12.10981081, 12.070209, 12.09528824),
        (2, 11.72073428, 11.622139, 11.74052253),
        (3, 11.82455653, 11.926414, 11.92652727),
        (4, 11.80086775, 11.72773 , 11.72973699),
        (5, 12.49098389, 12.50244 , 12.53089367)]],
dtype=(numpy.record, [('index', '<i8'), ('gbm', '<f8'), ('nnet', '<f4'),
       ('reg', '<f8')]))

4

আরকিজিস টেবিলের ডেটাফ্রেম থেকে রফতানি করার সময় এবং ইউএসএস ( https://my.usgs.gov/confluence/display/cdi/pandas.DataFrame+to+ArcGIS+ টেবিল ) থেকে সমাধানের ক্ষেত্রে হোঁচট খেতে গিয়ে ঠিক একইরকম সমস্যা হয়েছিল । সংক্ষেপে আপনার সমস্যার একই সমাধান রয়েছে:

df

      A    B    C
ID               
1   NaN  0.2  NaN
2   NaN  NaN  0.5
3   NaN  0.2  0.5
4   0.1  0.2  NaN
5   0.1  0.2  0.5
6   0.1  NaN  0.5
7   0.1  NaN  NaN

np_data = np.array(np.rec.fromrecords(df.values))
np_names = df.dtypes.index.tolist()
np_data.dtype.names = tuple([name.encode('UTF8') for name in np_names])

np_data

array([( nan,  0.2,  nan), ( nan,  nan,  0.5), ( nan,  0.2,  0.5),
       ( 0.1,  0.2,  nan), ( 0.1,  0.2,  0.5), ( 0.1,  nan,  0.5),
       ( 0.1,  nan,  nan)], 
      dtype=(numpy.record, [('A', '<f8'), ('B', '<f8'), ('C', '<f8')]))

4

আমি উপরের উত্তর দিয়ে গেছে। " As_matrix () " পদ্ধতিটি কাজ করে তবে এটি এখন অপ্রচলিত। আমার জন্য, " .to_numpy () " কী কাজ করেছিল ।

এটি একটি বহুমাত্রিক অ্যারে প্রদান করে। আপনি যদি এক্সেল শীট থেকে ডেটা পড়েন এবং কোনও সূচক থেকে আপনার ডেটা অ্যাক্সেস করতে হবে তবে আমি এই পদ্ধতিটি ব্যবহার করতে পছন্দ করব। আশাকরি এটা সাহায্য করবে :)


আপনি কী বলতে চাইছেন এবং কোনও সূচক থেকে আপনার ডেটা অ্যাক্সেস করতে হবে ? আপনার ডেটা প্রকৃতির উপর নির্ভর করে একটি পান্ডাস ডেটা ফ্রেম প্রথম স্থানে সঠিক পছন্দও নাও করতে পারে।
এএমসি

2

মেটিয়রের উত্তর, আমি কোডটি খুঁজে পেয়েছি

df.index = df.index.astype('i8')

আমার জন্য কাজ করে না। সুতরাং আমি এই কোডটিতে আটকে থাকা অন্যের সুবিধার্থে আমার কোডটি এখানে রেখেছি।

city_cluster_df = pd.read_csv(text_filepath, encoding='utf-8')
# the field 'city_en' is a string, when converted to Numpy array, it will be an object
city_cluster_arr = city_cluster_df[['city_en','lat','lon','cluster','cluster_filtered']].to_records()
descr=city_cluster_arr.dtype.descr
# change the field 'city_en' to string type (the index for 'city_en' here is 1 because before the field is the row index of dataframe)
descr[1]=(descr[1][0], "S20")
newArr=city_cluster_arr.astype(np.dtype(descr))

1

ডেটাফ্রেমকে ন্যালি অ্যারেতে রূপান্তর করার একটি সহজ উপায়:

import pandas as pd
df = pd.DataFrame({"A": [1, 2], "B": [3, 4]})
df_to_array = df.to_numpy()
array([[1, 3],
   [2, 4]])

To_numpy ব্যবহার ধারাবাহিকতা রক্ষা করতে উত্সাহিত করা হয়।

তথ্যসূত্র: https://pandas.pydata.org/pandas-docs/stable/references/api/pandas.DataFrame.to_numpy.html


আরসাম এবং আপনার প্রদত্ত সমাধানের মধ্যে পার্থক্য কী ...
কায়সার

একটি কোড উদাহরণ দিয়ে এটি আরও সম্পূর্ণ এবং ব্যবহারযোগ্য করার চেষ্টা করেছি, যা আমি ব্যক্তিগতভাবে পছন্দ করি।
ব্যবহারকারী 1460675

1

এটা চেষ্টা কর:

np.array(df) 

array([['ID', nan, nan, nan],
   ['1', nan, 0.2, nan],
   ['2', nan, nan, 0.5],
   ['3', nan, 0.2, 0.5],
   ['4', 0.1, 0.2, nan],
   ['5', 0.1, 0.2, 0.5],
   ['6', 0.1, nan, 0.5],
   ['7', 0.1, nan, nan]], dtype=object)

আরও কিছু তথ্য এখানে: [ https://docs.scipy.org/doc/numpy/references/generated/numpy.array.html] ন্যালি 1.16.5 এবং পান্ডাস 0.25.2 এর জন্য বৈধ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.