পান্ডাস ডেটাফ্রেমে / নম্পি অ্যারে "অক্ষ" সংজ্ঞাটিতে দ্ব্যর্থতা


93

পাইথন অক্ষগুলি কীভাবে সংজ্ঞায়িত করা হয় এবং তারা ডেটাফ্রেমের সারি বা কলামগুলি উল্লেখ করে কিনা তা নিয়ে আমি খুব বিভ্রান্ত হয়ে পড়েছি। নীচের কোডটি বিবেচনা করুন:

>>> df = pd.DataFrame([[1, 1, 1, 1], [2, 2, 2, 2], [3, 3, 3, 3]], columns=["col1", "col2", "col3", "col4"])
>>> df
   col1  col2  col3  col4
0     1     1     1     1
1     2     2     2     2
2     3     3     3     3

সুতরাং আমরা যদি কল করি তবে আমরা df.mean(axis=1)সারিগুলির মধ্যে একটি অর্থ পেয়ে যাব:

>>> df.mean(axis=1)
0    1
1    2
2    3

তবে, আমরা যদি কল করি df.drop(name, axis=1), আমরা আসলে একটি কলাম না, একটি সারিতে না:

>>> df.drop("col4", axis=1)
   col1  col2  col3
0     1     1     1
1     2     2     2
2     3     3     3

পান্ডাস / নম্পি / স্কিপিতে "অক্ষ" বলতে কী বোঝায় কেউ আমাকে বুঝতে সাহায্য করতে পারে?

একটি পার্শ্ব নোট, DataFrame.meanশুধু ভুল সংজ্ঞায়িত করা যেতে পারে। এটি ডকুমেন্টেশনে এর জন্য বলছে DataFrame.meanযে axis=1কলামগুলির চেয়ে সারি নয়, তার মানে হবে ...


উপস্বের বিস্তারিত ব্যাখ্যার জন্য, 'কলাম' এবং 'সূচক' / 'সারি' নীচে এই উত্তরটি দেখুন
টেড পেট্রো

এটা ঠিক অদ্ভুত। অক্ষটি পুরো meanএবং এর জুড়ে সামঞ্জস্যপূর্ণ হওয়া উচিত drop। আসল আচরণে পৌঁছাতে ননরেখা চিন্তাভাবনা লাগে।
স্টিফেনবোশ

উত্তর:


169

এটিকে 0 = ডাউন এবং 1 = জুড়ে মনে রাখা খুব সহজ ।

এর অর্থ:

  • axis=0প্রতিটি কলামের নীচে বা সারি লেবেলে (সূচক) কোনও পদ্ধতি প্রয়োগ করতে ব্যবহার করুন ।
  • axis=1প্রতিটি সারিতে বা কলাম লেবেলে কোনও পদ্ধতি প্রয়োগ করতে ব্যবহার করুন ।

এখানে প্রতিটি অক্ষ অক্ষ্য হিসাবে ডেটাফ্রেমের অংশগুলি দেখানোর জন্য এখানে একটি চিত্র:

এটি মনে রাখাও কার্যকর যে পান্ডগণ নম্পপি শব্দটি ব্যবহার করে axis। NumPy এর শর্তাবলী এর ব্যবহার ব্যাখ্যা করা হয়েছে :

অক্ষগুলি একাধিক মাত্রা সহ অ্যারেগুলির জন্য সংজ্ঞায়িত হয়। একটি 2-মাত্রিক অ্যারেতে দুটি অনুরূপ অক্ষ থাকে: প্রথমটি সারি (অক্ষ 0) এর উপরে উলম্বভাবে চলমান , এবং দ্বিতীয়টি কলামগুলি জুড়ে অনুভূমিকভাবে চলমান (অক্ষ 1) । [ আমার জোর ]

সুতরাং, প্রশ্নের পদ্ধতি সম্পর্কে, df.mean(axis=1)সঠিকভাবে সংজ্ঞায়িত বলে মনে হচ্ছে। এটি কলামগুলি জুড়ে অনুভূমিকভাবে প্রবেশের গড় গ্রহণ করে , এটি প্রতিটি স্বতন্ত্র সারি বরাবর। অন্যদিকে, সারি সারি পেরিয়েdf.mean(axis=0) উলম্বভাবে অভিনয় করা একটি অপারেশন হবে ।

একইভাবে, df.drop(name, axis=1)কলাম লেবেলের একটি ক্রিয়াকে বোঝায় কারণ তারা স্বজ্ঞাতভাবে অনুভূমিক অক্ষটি পেরিয়ে যান। সুনির্দিষ্ট axis=0পদ্ধতি পরিবর্তে সারিগুলিতে কাজ করবে।


4
যা আমাকে লড়াইয়ে ডেকেছিল, তা হল df.apply (..., অক্ষ = 0), অক্ষ 0 (সূচক) "ওভার" করেনি, তবে কলামগুলিতে দৌড়েছিল, সমস্ত সূচকযুক্ত সিরিজ পুনরুদ্ধার করে। ক্লুটি হ'ল, df.apply (..., অক্ষ = 0) সিরিজটি ফেরত দেয় যাতে আপনি সম্পূর্ণ সূচকে অপারেটিং চলমান প্রয়োগ করতে পারেন।
মরিৎসচেফার

4
আমি মনে করি আপনি যদি df.applyকোনও পদ্ধতির সাথে সাদৃশ্য দেখেন তবে এটিও সহায়তা করে df.sum। উদাহরণস্বরূপ, df.sum(axis=0)ডেটাফ্রেমের প্রতিটি কলামের যোগফল। একইভাবে, আপনি df.apply(sum, axis=0)ঠিক একই অপারেশন করতে লিখতে পারেন। অপারেশনটি প্রকৃতপক্ষে ডাটাফ্রেমের প্রতিটি কলামে প্রয়োগ করা হয়েছে, আসল ফাংশনটি 0 অক্ষের নিচে চলেছে
অ্যালেক্স রিলি

এটি দুর্ভাগ্যজনক যে নামকরণ এবং আদেশের কনভেনশনগুলি আর এর প্রয়োগ ফাংশনের বিপরীত - আরে, "1" এর নীচের ( প্যান্ডাসের অনুরূপ ) মান "সারি" এর সাথে মিলে যায় যার অর্থ ফাংশনটি প্রতিটি সারিতে প্রয়োগ করা হয় , যখন "2" এর বৃহত্তর মান "কলামগুলি" বোঝায় যার অর্থ প্রতিটি কলামে ফাংশন প্রয়োগ করা হয়MARGINaxis
কিথ হুগিট

এটা পান্ডাস একটি ধ্বংসাত্মক বাগ সংশোধন করা হয়
ক্যালকুলাস

10

ব্যাখ্যা করার আরেকটি উপায়:

// Not realistic but ideal for understanding the axis parameter 
df = pd.DataFrame([[1, 1, 1, 1], [2, 2, 2, 2], [3, 3, 3, 3]],
                  columns=["idx1", "idx2", "idx3", "idx4"],
                  index=["idx1", "idx2", "idx3"]
                 )

---------------------------------------1
|          idx1  idx2  idx3  idx4
|    idx1     1     1     1     1
|    idx2     2     2     2     2
|    idx3     3     3     3     3
0

df.dropঅক্ষ সম্পর্কে (অবস্থান অর্থ অবস্থান)

A: I wanna remove idx3.
B: **Which one**? // typing while waiting response: df.drop("idx3",
A: The one which is on axis 1
B: OK then it is >> df.drop("idx3", axis=1)

// Result
---------------------------------------1
|          idx1  idx2     idx4
|    idx1     1     1     1
|    idx2     2     2     2
|    idx3     3     3     3
0

সম্পর্কে df.apply(অক্ষ মানে দিক)

A: I wanna apply sum.
B: Which direction? // typing while waiting response: df.apply(lambda x: x.sum(),
A: The one which is on *parallel to axis 0*
B: OK then it is >> df.apply(lambda x: x.sum(), axis=0)

// Result
idx1    6
idx2    6
idx3    6
idx4    6

আপনি কি মনে করেন না, অক্ষ 1 এবং সমান্তরাল 0 অক্ষর সমান?
নিউয়েন্স

9

ইতিমধ্যে যথাযথ উত্তর রয়েছে তবে আমি আপনাকে> 2 মাত্রা সহ আরও একটি উদাহরণ দিচ্ছি।

প্যারামিটারটির axisঅর্থ অক্ষটি পরিবর্তন করা
উদাহরণস্বরূপ, বিবেচনা করুন যে ডাইমেনশন axbxc সহ একটি ডেটা ফ্রেম রয়েছে

  • df.mean(axis=1)ডাইমেনশন কুড়াল 1 এক্সসি সহ একটি ডেটাফ্রেম প্রদান করে ।
  • df.drop("col4", axis=1)মাত্রা কুঠার (বি -1) এক্সসি সহ একটি ডেটাফ্রেম প্রদান করে ।

এখানে, axis=1দ্বিতীয় অক্ষটি যা বোঝায় b, তাই bএই উদাহরণগুলিতে মান পরিবর্তন করা হবে।


4
এই উত্তরটি আমি এই বিষয়টিতে যা দেখেছি তার চেয়ে বেশি স্বজ্ঞাত। যাইহোক, পান্ডাসের চেয়ে বহুমাত্রিক অ্যারেগুলির জন্য এক্সারেটি আরও ভাল।
alys

2

এটি আরও ব্যাপকভাবে জানা উচিত যে পূর্ণসংখ্যা 0/1 এর জায়গায় স্ট্রিং অ্যালিয়াস 'সূচক' এবং 'কলাম' ব্যবহার করা যেতে পারে। উপনামগুলি আরও বেশি স্পষ্ট এবং গণনাগুলি কীভাবে ঘটে তা মনে রাখতে আমাকে সহায়তা করে। 'সূচক' এর জন্য অন্য একটি নাম 'সারি'

কখন axis='index'ব্যবহৃত হয়, তারপরে গণনাগুলি কলামগুলিতে ঘটে যা বিভ্রান্তিকর। তবে, আমি এটির ফলস্বরূপ মনে রাখি যা অন্য সারির সমান আকার।

আমি কী সম্পর্কে বলছি তা দেখার জন্য স্ক্রিনে কিছু তথ্য আসুন:

df = pd.DataFrame(np.random.rand(10, 4), columns=list('abcd'))
          a         b         c         d
0  0.990730  0.567822  0.318174  0.122410
1  0.144962  0.718574  0.580569  0.582278
2  0.477151  0.907692  0.186276  0.342724
3  0.561043  0.122771  0.206819  0.904330
4  0.427413  0.186807  0.870504  0.878632
5  0.795392  0.658958  0.666026  0.262191
6  0.831404  0.011082  0.299811  0.906880
7  0.749729  0.564900  0.181627  0.211961
8  0.528308  0.394107  0.734904  0.961356
9  0.120508  0.656848  0.055749  0.290897

যখন আমরা সমস্ত কলামের গড় নিতে চাই, আমরা axis='index'নিম্নলিখিতগুলি পেতে ব্যবহার করি :

df.mean(axis='index')
a    0.562664
b    0.478956
c    0.410046
d    0.546366
dtype: float64

একই ফলাফল অর্জন করা হবে:

df.mean() # default is axis=0
df.mean(axis=0)
df.mean(axis='rows')

সারিগুলিতে বাম থেকে ডানদিকে কোনও ক্রিয়াকলাপ ব্যবহার করতে অক্ষ = 'কলাম' ব্যবহার করুন। আমি মনে করে এটি মনে করি যে আমার ডেটা ফ্রেমে একটি অতিরিক্ত কলাম যুক্ত হতে পারে:

df.mean(axis='columns')
0    0.499784
1    0.506596
2    0.478461
3    0.448741
4    0.590839
5    0.595642
6    0.512294
7    0.427054
8    0.654669
9    0.281000
dtype: float64

একই ফলাফল অর্জন করা হবে:

df.mean(axis=1)

অক্ষ = 0 / সূচক / সারি সহ একটি নতুন সারি যুক্ত করুন

ব্যাখ্যাটি সম্পূর্ণ করতে অতিরিক্ত সারি বা কলাম যুক্ত করতে এই ফলাফলগুলি ব্যবহার করুন। সুতরাং, যখনই অক্ষ = 0 / সূচক / সারি ব্যবহার করা হয়, এটি ডাটাফ্রেমের একটি নতুন সারি পাওয়ার মতো। আসুন একটি সারি যুক্ত করুন:

df.append(df.mean(axis='rows'), ignore_index=True)

           a         b         c         d
0   0.990730  0.567822  0.318174  0.122410
1   0.144962  0.718574  0.580569  0.582278
2   0.477151  0.907692  0.186276  0.342724
3   0.561043  0.122771  0.206819  0.904330
4   0.427413  0.186807  0.870504  0.878632
5   0.795392  0.658958  0.666026  0.262191
6   0.831404  0.011082  0.299811  0.906880
7   0.749729  0.564900  0.181627  0.211961
8   0.528308  0.394107  0.734904  0.961356
9   0.120508  0.656848  0.055749  0.290897
10  0.562664  0.478956  0.410046  0.546366

অক্ষ = 1 / কলাম সহ একটি নতুন কলাম যুক্ত করুন

একইভাবে, অক্ষ = 1 / কলাম যখন এটি এমন ডেটা তৈরি করে যা সহজেই তার নিজস্ব কলামে তৈরি করা যায়:

df.assign(e=df.mean(axis='columns'))

          a         b         c         d         e
0  0.990730  0.567822  0.318174  0.122410  0.499784
1  0.144962  0.718574  0.580569  0.582278  0.506596
2  0.477151  0.907692  0.186276  0.342724  0.478461
3  0.561043  0.122771  0.206819  0.904330  0.448741
4  0.427413  0.186807  0.870504  0.878632  0.590839
5  0.795392  0.658958  0.666026  0.262191  0.595642
6  0.831404  0.011082  0.299811  0.906880  0.512294
7  0.749729  0.564900  0.181627  0.211961  0.427054
8  0.528308  0.394107  0.734904  0.961356  0.654669
9  0.120508  0.656848  0.055749  0.290897  0.281000

এটি প্রদর্শিত হয় যে আপনি নিম্নলিখিত ব্যক্তিগত ভেরিয়েবলগুলির সাথে সমস্ত উপাত্ত দেখতে পাচ্ছেন:

df._AXIS_ALIASES
{'rows': 0}

df._AXIS_NUMBERS
{'columns': 1, 'index': 0}

df._AXIS_NAMES
{0: 'index', 1: 'columns'}

1

যখন অক্ষ = 'সারি' বা অক্ষ = 0 হয়, এর অর্থ সারিগুলির দিকে, নীচে পর্যন্ত অ্যাক্সেস উপাদানগুলি। অক্ষ = 0 বরাবর যোগফল প্রয়োগ করে, এটি আমাদের প্রতিটি কলামে মোট দেয়।

অক্ষ = 'কলাম' বা অক্ষ = 1 হলে এর অর্থ বাম থেকে ডানে কলামগুলির দিকের অ্যাক্সেস উপাদানগুলি। অক্ষ = 1 বরাবর যোগফল প্রয়োগ করা হলে আমরা প্রতিটি সারির মোট যোগফল পাব।

এখনও বিভ্রান্ত! তবে উপরেরটি এটি আমার জন্য কিছুটা সহজ করে তোলে।


0

আমি অন্যান্য সমস্ত উত্তর গুলিয়ে ফেলছি। আমি এটি সম্পর্কে কীভাবে ভাবছি তা এখানে:

axis=0: ফলাফলের আকারটি অনুভূমিক (একটি সারি)
axis=1: ফলাফলের আকারটি উল্লম্ব (একটি কলাম)

তাই

  • df.drop(name, axis=1): একটি কলাম ড্রপ
  • df.mean(axis=1): একটি কলাম গণনা করে (ফলাফলটি একটি নতুন কলাম হিসাবে যুক্ত করা যেতে পারে)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.