পান্ডসের কনক্যাট ফাংশনে 'স্তর', 'কী' এবং নামের যুক্তি কী?


97

প্রশ্ন

  • আমি কীভাবে ব্যবহার করব pd.concat?
  • কিসের পক্ষে levelsযুক্তি?
  • কিসের পক্ষে keysযুক্তি?
  • সমস্ত আর্গুমেন্ট কীভাবে ব্যবহার করবেন তা বোঝাতে সাহায্য করার জন্য কি গুচ্ছ উদাহরণ রয়েছে?

পান্ডসের concatকাজ হ'ল মার্জিং ইউটিলিটিগুলির সুইস আর্মি ছুরি । এটি বিভিন্ন পরিস্থিতিতে বিভিন্ন পরিস্থিতিতে রয়েছে। বিদ্যমান ডকুমেন্টেশনগুলি কিছু arguচ্ছিক আর্গুমেন্টের কয়েকটি বিবরণ ছেড়ে দেয়। এর মধ্যে যুক্তি levelskeysযুক্তি রয়েছে। এই যুক্তিগুলি কী করে তা নির্ধারণের জন্য আমি সেট করে রেখেছি।

আমি একটি প্রশ্ন করব যা এর বিভিন্ন দিকের প্রবেশদ্বার হিসাবে কাজ করবে pd.concat

তথ্য ফ্রেম বিবেচনা করুন d1, d2এবং d3:

import pandas as pd

d1 = pd.DataFrame(dict(A=.1, B=.2, C=.3), [2, 3])
d2 = pd.DataFrame(dict(B=.4, C=.5, D=.6), [1, 2])
d3 = pd.DataFrame(dict(A=.7, B=.8, D=.9), [1, 3])

আমি যদি এই সাথে একত্রে সম্মত হন

pd.concat([d1, d2, d3], keys=['d1', 'd2', 'd3'])

আমি pandas.MultiIndexআমার columnsঅবজেক্টটির সাথে প্রত্যাশিত ফলাফলটি পেয়েছি :

        A    B    C    D
d1 2  0.1  0.2  0.3  NaN
   3  0.1  0.2  0.3  NaN
d2 1  NaN  0.4  0.5  0.6
   2  NaN  0.4  0.5  0.6
d3 1  0.7  0.8  NaN  0.9
   3  0.7  0.8  NaN  0.9

যাইহোক, আমি levelsআর্গুমেন্ট ডকুমেন্টেশন ব্যবহার করতে চেয়েছিলাম :

স্তরসমূহ : ক্রমগুলির তালিকা, ডিফল্ট কোনও নয়। মাল্টিআইডেক্স তৈরির জন্য নির্দিষ্ট স্তরের (অনন্য মান)। অন্যথায়, তারা কীগুলি থেকে অনুমান করা হবে।

তাই আমি পাস

pd.concat([d1, d2, d3], keys=['d1', 'd2', 'd3'], levels=[['d1', 'd2']])

এবং একটি পেতে KeyError

ValueError: Key d3 not in level Index(['d1', 'd2'], dtype='object')

এই জ্ঞান তৈরি। আমি যে স্তরগুলি দিয়েছি সেগুলি কীগুলি দ্বারা নির্দেশিত প্রয়োজনীয় স্তরগুলি বর্ণনা করতে অপর্যাপ্ত ছিল। আমি উপরে কিছু না পারলে, যেমন আমি উপরে করেছি, স্তরগুলি অনুমান করা হয় (ডকুমেন্টেশনে বর্ণিত হিসাবে) তবে আমি আরও কীভাবে এই তর্কটিকে আরও কার্যকরভাবে ব্যবহার করতে পারি?

আমি যদি এর পরিবর্তে এটি চেষ্টা করে থাকি:

pd.concat([d1, d2, d3], keys=['d1', 'd2', 'd3'], levels=[['d1', 'd2', 'd3']])

আমি এবং উপরের মতো একই ফলাফল পেয়েছি। তবে যখন আমি স্তরগুলিতে আরও একটি মান যুক্ত করি,

df = pd.concat([d1, d2, d3], keys=['d1', 'd2', 'd3'], levels=[['d1', 'd2', 'd3', 'd4']])

আমি একই সন্ধানী ডেটা ফ্রেম দিয়ে শেষ করি, তবে MultiIndexফলাফলটির অব্যবহৃত স্তর থাকে।

df.index.levels[0]

Index(['d1', 'd2', 'd3', 'd4'], dtype='object')

সুতরাং levelতর্কের বিন্দুটি কী এবং আমি keysআলাদাভাবে ব্যবহার করা উচিত ?

আমি পাইথন 3.6 এবং পান্ডাস 0.22 ব্যবহার করছি।

উত্তর:


129

নিজের জন্য এই প্রশ্নের উত্তর দেওয়ার প্রক্রিয়ায়, আমি অনেক কিছু শিখেছি এবং উদাহরণ এবং কিছু ব্যাখ্যা একটি ক্যাটালগ একসাথে রাখতে চেয়েছিলাম।

levelsতর্কের বিন্দুর নির্দিষ্ট উত্তরটি শেষের দিকে আসবে।

pandas.concat: অনুপস্থিত ম্যানুয়াল

বর্তমান ডকুমেন্টেশন লিঙ্ক

পণ্যগুলি আমদানি এবং সংজ্ঞা দেয়

import pandas as pd

d1 = pd.DataFrame(dict(A=.1, B=.2, C=.3), index=[2, 3])
d2 = pd.DataFrame(dict(B=.4, C=.5, D=.6), index=[1, 2])
d3 = pd.DataFrame(dict(A=.7, B=.8, D=.9), index=[1, 3])

s1 = pd.Series([1, 2], index=[2, 3])
s2 = pd.Series([3, 4], index=[1, 2])
s3 = pd.Series([5, 6], index=[1, 3])

যুক্তি

objs

প্রথম যুক্তিটি আমরা দেখতে পাচ্ছি objs:

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

  • আমরা সাধারণত এটি ব্যবহারের একটি তালিকা Seriesবা DataFrameবস্তুর সাথে দেখতে পাই ।
  • আমি dictএটি খুব দরকারী হতে পারে প্রদর্শন করব ।
  • জেনারেটরগুলিও ব্যবহার করা যেতে পারে এবং mapহিসাবে ব্যবহারের সময় এটি কার্যকর হতে পারেmap(f, list_of_df)

আপাতত, আমরা উপরের সংজ্ঞায়িত কিছু DataFrameএবং Seriesসামগ্রীর একটি তালিকা দিয়ে স্টিক করব । আমি পরে কীভাবে খুব দরকারী MultiIndexফলাফল দেওয়ার জন্য অভিধানগুলি কীভাবে লাভ করা যায় তা দেখাব show

pd.concat([d1, d2])

     A    B    C    D
2  0.1  0.2  0.3  NaN
3  0.1  0.2  0.3  NaN
1  NaN  0.4  0.5  0.6
2  NaN  0.4  0.5  0.6

axis

দ্বিতীয় আর্গুমেন্টটি আমরা মুখোমুখি হলাম axisযার ডিফল্ট মান 0:

অক্ষ : {0 / 'সূচক', 1 / 'কলাম'}, ডিফল্ট 0 অক্ষটি বরাবর আঁকতে হবে।

সাথে দুটি DataFrameএসaxis=0 (স্ট্যাকড)

0বা এর মানগুলির জন্যindex আমরা বলতে চাইছি: "কলামগুলির সাথে সারিবদ্ধ করুন এবং সূচীতে যুক্ত করুন"।

উপরে যেখানে আমরা ব্যবহার করেছি যেখানে প্রদর্শিত হয়েছে axis=0, কারণ 0এটি পূর্বনির্ধারিত মান এবং আমরা দেখতে পাই যে মানটির ওভারল্যাপ থাকা সত্ত্বেও d2সূচকটি সূচকে প্রসারিত করে :d12

pd.concat([d1, d2], axis=0)

     A    B    C    D
2  0.1  0.2  0.3  NaN
3  0.1  0.2  0.3  NaN
1  NaN  0.4  0.5  0.6
2  NaN  0.4  0.5  0.6

সাথে দুটি DataFrameএসaxis=1 (পাশাপাশি)

মানগুলির জন্য 1বা columnsআমরা বলতে চাইছি: "সূচীর সাথে সারিবদ্ধ করুন এবং কলামগুলিতে যুক্ত করুন",

pd.concat([d1, d2], axis=1)

     A    B    C    B    C    D
1  NaN  NaN  NaN  0.4  0.5  0.6
2  0.1  0.2  0.3  0.4  0.5  0.6
3  0.1  0.2  0.3  NaN  NaN  NaN

আমরা দেখতে পাচ্ছি যে ফলাফল সূচকগুলি সূচকগুলির সংঘ এবং ফলাফলযুক্ত কলামগুলি কলামগুলির d1দ্বারা কলামগুলির সম্প্রসারণ হয়d2

দুই (বা তিন) Seriesসাথেaxis=0 (স্ট্যাকড)

pandas.Seriesপাশাপাশি একত্রিত হলে axis=0, আমরা একটি ফিরে পেতে pandas.Series। ফলে নাম Seriesহতে হবে Noneযদি না সব Seriesহচ্ছে মিলিত নাম একই। 'Name: A'যখন আমরা ফলাফলটি মুদ্রণ করি তখন মনোযোগ দিন Series। এটি উপস্থিত না থাকলে আমরা Seriesনামটি ধরে নিতে পারি None

               |                       |                        |  pd.concat(
               |  pd.concat(           |  pd.concat(            |      [s1.rename('A'),
 pd.concat(    |      [s1.rename('A'), |      [s1.rename('A'),  |       s2.rename('B'),
     [s1, s2]) |       s2])            |       s2.rename('A')]) |       s3.rename('A')])
-------------- | --------------------- | ---------------------- | ----------------------
2    1         | 2    1                | 2    1                 | 2    1
3    2         | 3    2                | 3    2                 | 3    2
1    3         | 1    3                | 1    3                 | 1    3
2    4         | 2    4                | 2    4                 | 2    4
dtype: int64   | dtype: int64          | Name: A, dtype: int64  | 1    5
               |                       |                        | 3    6
               |                       |                        | dtype: int64

দুটি (বা তিন) Seriesপাশাপাশি axis=1(পাশাপাশি)

pandas.Seriesপাশাপাশি একত্রিত হওয়ার সময় axis=1, এটির nameফলাফলটি একটি কলামের নাম নির্ধারণ করার জন্য আমরা সেই বৈশিষ্ট্যটি উল্লেখ করি pandas.DataFrame

                       |                       |  pd.concat(
                       |  pd.concat(           |      [s1.rename('X'),
 pd.concat(            |      [s1.rename('X'), |       s2.rename('Y'),
     [s1, s2], axis=1) |       s2], axis=1)    |       s3.rename('Z')], axis=1)
---------------------- | --------------------- | ------------------------------
     0    1            |      X    0           |      X    Y    Z
1  NaN  3.0            | 1  NaN  3.0           | 1  NaN  3.0  5.0
2  1.0  4.0            | 2  1.0  4.0           | 2  1.0  4.0  NaN
3  2.0  NaN            | 3  2.0  NaN           | 3  2.0  NaN  6.0

মিশ্রিত Seriesএবং DataFrameসাথে axis=0(স্ট্যাকড)

একটি Seriesএবং DataFrameবরাবর একটি মনস্তাতন সম্পাদন করার সময় axis=0, আমরা সমস্ত Seriesএকক কলামে রূপান্তর করি DataFrame

এটি খেয়াল করুন যে এটি পাশাপাশি একটি কনটেন্টেশন axis=0; এর অর্থ কলামগুলি সারিবদ্ধ করার সময় সূচী (সারি) প্রসারিত করা। নীচের উদাহরণগুলিতে, আমরা সূচকটি দেখতে পাই [2, 3, 2, 3]যা সূচকের একটি নির্বিচার সংযোজন। Seriesযুক্তি দিয়ে কলামটির নামকরণকে বাধ্য না করা পর্যন্ত কলামগুলি ওভারল্যাপ হয় না to_frame:

 pd.concat(               |
     [s1.to_frame(), d1]) |  pd.concat([s1, d1])
------------------------- | ---------------------
     0    A    B    C     |      0    A    B    C
2  1.0  NaN  NaN  NaN     | 2  1.0  NaN  NaN  NaN
3  2.0  NaN  NaN  NaN     | 3  2.0  NaN  NaN  NaN
2  NaN  0.1  0.2  0.3     | 2  NaN  0.1  0.2  0.3
3  NaN  0.1  0.2  0.3     | 3  NaN  0.1  0.2  0.3

আপনি দেখতে পাচ্ছেন যে ফলাফলগুলি pd.concat([s1, d1])একই রকমের আমি যদি পারফর্মড করেছিলামto_frame নিজেকে।

যাইহোক, আমি পরামিতি দ্বারা ফলাফল কলামের নাম নিয়ন্ত্রণ করতে পারি to_frame। পদ্ধতিটির Seriesসাথে নামকরণ ফলাফলের কলামের নামটি নিয়ন্ত্রণ renameকরে নাDataFrame

 # Effectively renames       |                            |
 # `s1` but does not align   |  # Does not rename.  So    |  # Renames to something
 # with columns in `d1`      |  # Pandas defaults to `0`  |  # that does align with `d1`
 pd.concat(                  |  pd.concat(                |  pd.concat(
     [s1.to_frame('X'), d1]) |      [s1.rename('X'), d1]) |      [s1.to_frame('B'), d1])
---------------------------- | -------------------------- | ----------------------------
     A    B    C    X        |      0    A    B    C      |      A    B    C
2  NaN  NaN  NaN  1.0        | 2  1.0  NaN  NaN  NaN      | 2  NaN  1.0  NaN
3  NaN  NaN  NaN  2.0        | 3  2.0  NaN  NaN  NaN      | 3  NaN  2.0  NaN
2  0.1  0.2  0.3  NaN        | 2  NaN  0.1  0.2  0.3      | 2  0.1  0.2  0.3
3  0.1  0.2  0.3  NaN        | 3  NaN  0.1  0.2  0.3      | 3  0.1  0.2  0.3

মিশ্রিত Seriesএবং DataFrameসাথেaxis=1 (পাশাপাশি)

এটি মোটামুটি স্বজ্ঞাত। Seriesকলামের নাম Seriesযখন কোনও nameঅ্যাট্রিবিউট উপলব্ধ থাকে না তখন এই জাতীয় অবজেক্টের একটি গণনার ডিফল্ট হয় ।

                    |  pd.concat(
 pd.concat(         |      [s1.rename('X'),
     [s1, d1],      |       s2, s3, d1],
     axis=1)        |      axis=1)
------------------- | -------------------------------
   0    A    B    C |      X    0    1    A    B    C
2  1  0.1  0.2  0.3 | 1  NaN  3.0  5.0  NaN  NaN  NaN
3  2  0.1  0.2  0.3 | 2  1.0  4.0  NaN  0.1  0.2  0.3
                    | 3  2.0  NaN  6.0  0.1  0.2  0.3

join

তৃতীয় যুক্তি হ'ল joinযে বর্ণিত ফলাফলটি একটি বাহ্যিক মার্জ (ডিফল্ট) বা অভ্যন্তরীণ মার্জ হওয়া উচিত কিনা তা বর্ণনা করে।

যোগ দিন : ax 'অভ্যন্তরীণ', 'বাহ্যিক'}, ডিফল্ট 'বহিরাগত'
অন্যান্য অক্ষ (এস) এর সূচকগুলি কীভাবে পরিচালনা করতে হয়)

দেখা যাচ্ছে, এর মতো কোনও বিকল্প leftবা rightবিকল্প নেইpd.concat দুটি চেয়ে বেশি দুটি হ্যান্ডেল করতে পারে ।

ক্ষেত্রে d1এবং d2, বিকল্প মত চেহারা:

outer

pd.concat([d1, d2], axis=1, join='outer')

     A    B    C    B    C    D
1  NaN  NaN  NaN  0.4  0.5  0.6
2  0.1  0.2  0.3  0.4  0.5  0.6
3  0.1  0.2  0.3  NaN  NaN  NaN

inner

pd.concat([d1, d2], axis=1, join='inner')

     A    B    C    B    C    D
2  0.1  0.2  0.3  0.4  0.5  0.6

join_axes

চতুর্থ যুক্তি হ'ল এমন জিনিস যা আমাদের leftমার্জ এবং আরও অনেক কিছু করতে দেয় ।

join_axes : সূচক অবজেক্টের তালিকা
অভ্যন্তরীণ / বাহ্যিক সেট যুক্তি সম্পাদন না করে অন্যান্য এন - 1 অক্ষের জন্য নির্দিষ্ট সূচকগুলি ব্যবহার করতে হবে।

বাম মার্জ

pd.concat([d1, d2, d3], axis=1, join_axes=[d1.index])

     A    B    C    B    C    D    A    B    D
2  0.1  0.2  0.3  0.4  0.5  0.6  NaN  NaN  NaN
3  0.1  0.2  0.3  NaN  NaN  NaN  0.7  0.8  0.9

রাইট মার্জ

pd.concat([d1, d2, d3], axis=1, join_axes=[d3.index])

     A    B    C    B    C    D    A    B    D
1  NaN  NaN  NaN  0.4  0.5  0.6  0.7  0.8  0.9
3  0.1  0.2  0.3  NaN  NaN  NaN  0.7  0.8  0.9

ignore_index

উপেক্ষা_আইনডেক্স : বুলিয়ান, ডিফল্ট মিথ্যা
যদি সত্য হয় তবে সূচক মানগুলি সংক্ষিপ্ত অক্ষের সাথে ব্যবহার করবেন না। ফলস্বরূপ অক্ষটি 0, ..., n - 1 লেবেলযুক্ত হবে এটি যদি আপনি এমন বস্তুগুলিকে সংমিশ্রিত করে থাকেন যেখানে সংক্ষিপ্ত অক্ষের অর্থপূর্ণ সূচীকরণ তথ্য নেই This নোট করুন অন্যান্য অক্ষের সূচক মানগুলি এখনও যোগে সম্মানিত।

আমি যখন d1শীর্ষে স্ট্যাক করি তখনকার মতো d2, যদি আমি সূচকের মানগুলির বিষয়ে চিন্তা না করি তবে আমি সেগুলি পুনরায় সেট করতে বা এড়িয়ে যেতে পারি।

                      |  pd.concat(             |  pd.concat(
                      |      [d1, d2],          |      [d1, d2]
 pd.concat([d1, d2])  |      ignore_index=True) |  ).reset_index(drop=True)
--------------------- | ----------------------- | -------------------------
     A    B    C    D |      A    B    C    D   |      A    B    C    D
2  0.1  0.2  0.3  NaN | 0  0.1  0.2  0.3  NaN   | 0  0.1  0.2  0.3  NaN
3  0.1  0.2  0.3  NaN | 1  0.1  0.2  0.3  NaN   | 1  0.1  0.2  0.3  NaN
1  NaN  0.4  0.5  0.6 | 2  NaN  0.4  0.5  0.6   | 2  NaN  0.4  0.5  0.6
2  NaN  0.4  0.5  0.6 | 3  NaN  0.4  0.5  0.6   | 3  NaN  0.4  0.5  0.6

এবং ব্যবহার করার সময় axis=1:

                                   |     pd.concat(
                                   |         [d1, d2], axis=1,
 pd.concat([d1, d2], axis=1)       |         ignore_index=True)
-------------------------------    |    -------------------------------
     A    B    C    B    C    D    |         0    1    2    3    4    5
1  NaN  NaN  NaN  0.4  0.5  0.6    |    1  NaN  NaN  NaN  0.4  0.5  0.6
2  0.1  0.2  0.3  0.4  0.5  0.6    |    2  0.1  0.2  0.3  0.4  0.5  0.6
3  0.1  0.2  0.3  NaN  NaN  NaN    |    3  0.1  0.2  0.3  NaN  NaN  NaN

keys

সংশ্লিষ্ট মাল্টিআইডেক্সে টিপল বা স্কেলারের মান নির্ধারণের জন্য আমরা স্কেলার মান বা টিপলগুলির একটি তালিকা পাস করতে পারি। উত্তীর্ণ তালিকার দৈর্ঘ্য অবশ্যই সংযুক্ত হওয়া আইটেমের সংখ্যার সমান দৈর্ঘ্য হতে হবে।

কীগুলি : ক্রম, ডিফল্ট কিছুই নয়
যদি একাধিক স্তর পাস হয়ে থাকে তবে এতে টিপলস থাকা উচিত। বহিরাগত স্তর হিসাবে পাস কীগুলি ব্যবহার করে শ্রেণিবদ্ধ সূচক তৈরি করুন

axis=0

Seriesবরাবর বস্তুগুলি যখন সংযুক্ত করাaxis=0 (সূচী প্রসারিত) ।

এই কীগুলি, MultiIndexসূচক বৈশিষ্ট্যে কোনও অবজেক্টের নতুন প্রাথমিক স্তরে পরিণত হয় ।

 #           length 3             length 3           #         length 2        length 2
 #          /--------\         /-----------\         #          /----\         /------\
 pd.concat([s1, s2, s3], keys=['A', 'B', 'C'])       pd.concat([s1, s2], keys=['A', 'B'])
----------------------------------------------      -------------------------------------
A  2    1                                           A  2    1
   3    2                                              3    2
B  1    3                                           B  1    3
   2    4                                              2    4
C  1    5                                           dtype: int64
   3    6
dtype: int64

যাইহোক, আমরা keysআরও গভীরতর তৈরি করতে আর্গুমেন্টে স্কেলারের মানগুলির চেয়ে বেশি ব্যবহার করতে পারি MultiIndex। এখানে আমরা tuplesদৈর্ঘ্যের 2 টি পেরেকের দুটি নতুন স্তরের প্রিপেন্ড করলাম MultiIndex:

 pd.concat(
     [s1, s2, s3],
     keys=[('A', 'X'), ('A', 'Y'), ('B', 'X')])
-----------------------------------------------
A  X  2    1
      3    2
   Y  1    3
      2    4
B  X  1    5
      3    6
dtype: int64

axis=1

কলামগুলি বর্ধিত করার সময় এটি কিছুটা আলাদা। যখন আমরা ব্যবহার করি axis=0(উপরে দেখুন) বিদ্যমান সূচক ছাড়াও স্তর keysহিসাবে আমাদের অভিনয় MultiIndexকরে। কারণ axis=1, আমরা এমন একটি অক্ষরকে উল্লেখ করছি যা Seriesঅবজেক্টগুলি নেই, যথা columnsগুণাবলী।

দুটি Serieswtih এর প্রকরণaxis=1

লক্ষ্য করুন যে নামকরণ s1এবং s2বিষয়গুলি যতক্ষণ না keysপাস হয় ততক্ষণ তা পাস করা হয় তবে তা ওভাররাইড keysহয়ে যায়।

               |                       |                        |  pd.concat(
               |  pd.concat(           |  pd.concat(            |      [s1.rename('U'),
 pd.concat(    |      [s1, s2],        |      [s1.rename('U'),  |       s2.rename('V')],
     [s1, s2], |      axis=1,          |       s2.rename('V')], |       axis=1,
     axis=1)   |      keys=['X', 'Y']) |       axis=1)          |       keys=['X', 'Y'])
-------------- | --------------------- | ---------------------- | ----------------------
     0    1    |      X    Y           |      U    V            |      X    Y
1  NaN  3.0    | 1  NaN  3.0           | 1  NaN  3.0            | 1  NaN  3.0
2  1.0  4.0    | 2  1.0  4.0           | 2  1.0  4.0            | 2  1.0  4.0
3  2.0  NaN    | 3  2.0  NaN           | 3  2.0  NaN            | 3  2.0  NaN
MultiIndexসাথে Seriesএবংaxis=1
 pd.concat(
     [s1, s2],
     axis=1,
     keys=[('W', 'X'), ('W', 'Y')])
-----------------------------------
     W
     X    Y
1  NaN  3.0
2  1.0  4.0
3  2.0  NaN
দুই DataFrame সঙ্গেaxis=1

উদাহরণস্বরূপ axis=0, keysএকটিতে স্তরগুলি যুক্ত করুন MultiIndex, তবে এবার গুনটির মধ্যে থাকা অবজেক্টটিতে columns

 pd.concat(                     |  pd.concat(
     [d1, d2],                  |      [d1, d2],
     axis=1,                    |      axis=1,
     keys=['X', 'Y'])           |      keys=[('First', 'X'), ('Second', 'X')])
------------------------------- | --------------------------------------------
     X              Y           |   First           Second
     A    B    C    B    C    D |       X                X
1  NaN  NaN  NaN  0.4  0.5  0.6 |       A    B    C      B    C    D
2  0.1  0.2  0.3  0.4  0.5  0.6 | 1   NaN  NaN  NaN    0.4  0.5  0.6
3  0.1  0.2  0.3  NaN  NaN  NaN | 2   0.1  0.2  0.3    0.4  0.5  0.6
                                | 3   0.1  0.2  0.3    NaN  NaN  NaN
Series এবং DataFrame সাথেaxis=1

এটা কৌতুকপূর্ণ। এই ক্ষেত্রে, স্কেলার মূল মানটি Seriesযখন কলামে পরিণত হয় তখন এটির জন্য সূচকের একমাত্র স্তর হিসাবে কাজ করতে পারে না এবং এটির জন্য প্রথম স্তরের হিসাবে কাজ MultiIndexকরে DataFrame। সুতরাং পান্ডস আবার কলামের নাম হিসাবে উত্সটির nameবৈশিষ্ট্যটি ব্যবহার করবেন Series

 pd.concat(           |  pd.concat(
     [s1, d1],        |      [s1.rename('Z'), d1],
     axis=1,          |      axis=1,
     keys=['X', 'Y']) |      keys=['X', 'Y'])
--------------------- | --------------------------
   X    Y             |    X    Y
   0    A    B    C   |    Z    A    B    C
2  1  0.1  0.2  0.3   | 2  1  0.1  0.2  0.3
3  2  0.1  0.2  0.3   | 3  2  0.1  0.2  0.3
সীমাবদ্ধতা keysএবং MultiIndexঅনুমান।

পান্ডস কেবল নাম থেকে কলামের নামগুলি অনুমান করে বলে মনে হয় Series, তবে বিভিন্ন ফ্রেমের কলাম স্তরের সাথে ডেটা ফ্রেমের সাথে অ্যানালগাসমুক্ত কনটেন্টেশন করার সময় এটি শূন্যস্থান পূরণ করবে না।

d1_ = pd.concat(
    [d1], axis=1,
    keys=['One'])
d1_

   One
     A    B    C
2  0.1  0.2  0.3
3  0.1  0.2  0.3

এরপরে কলামের অবজেক্টের মাত্র এক স্তর সহ অন্য একটি ডেটা ফ্রেমের সাথে এটি যুক্ত করুন এবং পান্ডস বস্তুর টিপলগুলি চেষ্টা করতে এবং অস্বীকার করবে MultiIndexএবং সমস্ত ডেটা ফ্রেমগুলিকে একত্রিত করবে যেন একক স্তরের অবজেক্টস, স্কেলার এবং টিপলস।

pd.concat([d1_, d2], axis=1)

   (One, A)  (One, B)  (One, C)    B    C    D
1       NaN       NaN       NaN  0.4  0.5  0.6
2       0.1       0.2       0.3  0.4  0.5  0.6
3       0.1       0.2       0.3  NaN  NaN  NaN

A এর dictপরিবর্তে পাস করাlist

অভিধান পাস করার সময়, অভিধান pandas.concatথেকে কীগুলি keysপরামিতি হিসাবে ব্যবহার করবে ।

 # axis=0               |  # axis=1
 pd.concat(             |  pd.concat(
     {0: d1, 1: d2})    |      {0: d1, 1: d2}, axis=1)
----------------------- | -------------------------------
       A    B    C    D |      0              1
0 2  0.1  0.2  0.3  NaN |      A    B    C    B    C    D
  3  0.1  0.2  0.3  NaN | 1  NaN  NaN  NaN  0.4  0.5  0.6
1 1  NaN  0.4  0.5  0.6 | 2  0.1  0.2  0.3  0.4  0.5  0.6
  2  NaN  0.4  0.5  0.6 | 3  0.1  0.2  0.3  NaN  NaN  NaN

levels

এটি keysআর্গুমেন্টের সাথে একযোগে ব্যবহৃত হয় W levelsযখন এর ডিফল্ট মান হিসাবে রেখে যায় None, পান্ডস ফলাফলের প্রতিটি স্তরের অনন্য মান গ্রহণ করবে MultiIndexএবং ফলস্বরূপ index.levelsবৈশিষ্ট্যে ব্যবহৃত অবজেক্ট হিসাবে এটি ব্যবহার করবে ।

স্তরসমূহ : সিকোয়েন্সগুলির তালিকা, ডিফল্ট কিছুই নয়
একটি মাল্টিআইডেক্স তৈরির জন্য নির্দিষ্ট স্তরের (অনন্য মান)। অন্যথায় তারা কীগুলি থেকে অনুমান করা হবে।

যদি পান্ডগণ ইতিমধ্যে এই স্তরগুলির কী হওয়া উচিত তা নির্ধারণ করে থাকেন তবে এটিকে আমাদের নির্দিষ্ট করে দেওয়ার কী সুবিধা আছে? আমি এর একটি উদাহরণ দেখাব এবং এটি কী কারণে কার্যকর হতে পারে তার অন্যান্য কারণগুলি ভাবার জন্য এটি ছেড়ে দেব।

উদাহরণ

ডকুমেন্টেশন প্রতি, levels যুক্তি ক্রমগুলির তালিকা of এর অর্থ হ'ল আমরা pandas.Indexসেই ক্রমগুলির মধ্যে একটি হিসাবে অন্যটিকে ব্যবহার করতে পারি ।

ডেটা ফ্রেমটি বিবেচনা করুন dfযা এর উপসংহার d1, d2এবং andd3 :

df = pd.concat(
    [d1, d2, d3], axis=1,
    keys=['First', 'Second', 'Fourth'])

df

  First           Second           Fourth
      A    B    C      B    C    D      A    B    D
1   NaN  NaN  NaN    0.4  0.5  0.6    0.7  0.8  0.9
2   0.1  0.2  0.3    0.4  0.5  0.6    NaN  NaN  NaN
3   0.1  0.2  0.3    NaN  NaN  NaN    0.7  0.8  0.9

কলামগুলির অবজেক্টের স্তরগুলি হ'ল:

print(df, *df.columns.levels, sep='\n')

Index(['First', 'Second', 'Fourth'], dtype='object')
Index(['A', 'B', 'C', 'D'], dtype='object')

আমরা যদি sumএকটি মধ্যে ব্যবহারgroupby পাই এর করি তবে:

df.groupby(axis=1, level=0).sum()

   First  Fourth  Second
1    0.0     2.4     1.5
2    0.6     0.0     1.5
3    0.6     2.4     0.0

তবে এর পরিবর্তে যদি ['First', 'Second', 'Fourth']আরও একটি অনুপস্থিত বিভাগের নামকরণ হয় Thirdএবং Fifth? এবং আমি এগুলিকে এ এর ​​ফলাফলের সাথে অন্তর্ভুক্ত করতে চেয়েছিলামgroupby একত্রিত ? আমরা যদি এটি করতে পারি তবে আমরা এটি করতে পারি pandas.CategoricalIndex। এবং আমরা যে সময়ের সাথে এটি আগে উল্লেখ করতে পারিlevels আর্গুমেন্ট ।

সুতরাং পরিবর্তে, এর সংজ্ঞা দেওয়া যাক df:

cats = ['First', 'Second', 'Third', 'Fourth', 'Fifth']
lvl = pd.CategoricalIndex(cats, categories=cats, ordered=True)

df = pd.concat(
    [d1, d2, d3], axis=1,
    keys=['First', 'Second', 'Fourth'],
    levels=[lvl]
)

df

   First  Fourth  Second
1    0.0     2.4     1.5
2    0.6     0.0     1.5
3    0.6     2.4     0.0

তবে কলামগুলির অবজেক্টের প্রথম স্তরটি হ'ল:

df.columns.levels[0]

CategoricalIndex(
    ['First', 'Second', 'Third', 'Fourth', 'Fifth'],
    categories=['First', 'Second', 'Third', 'Fourth', 'Fifth'],
    ordered=True, dtype='category')

এবং আমাদের groupbyসংক্ষেপটি দেখে মনে হচ্ছে:

df.groupby(axis=1, level=0).sum()

   First  Second  Third  Fourth  Fifth
1    0.0     1.5    0.0     2.4    0.0
2    0.6     1.5    0.0     0.0    0.0
3    0.6     0.0    0.0     2.4    0.0

names

এটি ফলাফলের স্তরের নামকরণ করতে ব্যবহৃত হয় MultiIndexnamesতালিকার দৈর্ঘ্য ফলাফলের স্তরের সংখ্যার সাথে মেলে MultiIndex

নাম : তালিকা, ডিফল্ট কিছুই নয়
ফলাফল ফলাফলক্রমক্রমিক সূচকের স্তরের জন্য নাম

 # axis=0                     |  # axis=1
 pd.concat(                   |  pd.concat(
     [d1, d2],                |      [d1, d2],
     keys=[0, 1],             |      axis=1, keys=[0, 1],
     names=['lvl0', 'lvl1'])  |      names=['lvl0', 'lvl1'])
----------------------------- | ----------------------------------
             A    B    C    D | lvl0    0              1
lvl0 lvl1                     | lvl1    A    B    C    B    C    D
0    2     0.1  0.2  0.3  NaN | 1     NaN  NaN  NaN  0.4  0.5  0.6
     3     0.1  0.2  0.3  NaN | 2     0.1  0.2  0.3  0.4  0.5  0.6
1    1     NaN  0.4  0.5  0.6 | 3     0.1  0.2  0.3  NaN  NaN  NaN
     2     NaN  0.4  0.5  0.6 |

verify_integrity

স্ব বর্ণনামূলক ডকুমেন্টেশন

যাচাই_সংহততা : বুলিয়ান, ডিফল্ট মিথ্যা
নতুন সদৃশ রয়েছে কিনা তা পরীক্ষা করুন। এটি সত্যিকারের ডেটা কনটেন্টেশনের তুলনায় খুব ব্যয়বহুল হতে পারে।

যেহেতু ফলাফলকে সূচকটি একত্রিত করে d1এবং d2অনন্য নয়, এটি অখণ্ডতা পরীক্ষায় ব্যর্থ হবে।

pd.concat([d1, d2])

     A    B    C    D
2  0.1  0.2  0.3  NaN
3  0.1  0.2  0.3  NaN
1  NaN  0.4  0.5  0.6
2  NaN  0.4  0.5  0.6

এবং

pd.concat([d1, d2], verify_integrity=True)

> মানমূল: সূচকের ওভারল্যাপিংয়ের মান রয়েছে: [২]


23
মূল ডক্সে কিছু অনুপস্থিত উদাহরণ (মাত্র একটি দম্পতি) যুক্ত করার জন্য কেবল অনুরোধটি করা সম্প্রদায়ের পক্ষে সত্যই আরও কার্যকর হবে; এসও কেবল অনুসন্ধানযোগ্য এবং ব্রাউজ সক্ষম নয়; ডক্সে আরও একটি লিঙ্ক স্থাপন এখানে কার্যকর হবে - এর বিশাল অংশ ইতিমধ্যে ভাল এবং সম্পূর্ণ নথিভুক্ত
জেফ

6
@ জেফ আমার বিকাশের বিভিন্ন মাত্রা রয়েছে যা ধীর ছিল। গিট ব্যবহার করা তাদের মধ্যে একটি। আমি প্রতিশ্রুতিবদ্ধ যে আমি কি কাজ শুরু করতে চান।
পিয়ারসকেয়ার্ড

ব্যবহারের pd.concat(..., levels=[lvl]).groupby(axis=1, level=0).sum()চেয়ে আলাদা ফলাফল তৈরি হয় pd.concat(..., levels=[cats]).groupby(axis=1, level=0).sum()। তুমি কি জানো কেন? দস্তাবেজগুলি কেবলমাত্র বলছে levelsক্রমগুলির তালিকা হওয়া উচিত।
unutbu

4
দুর্দান্ত উত্তর, তবে আমি মনে করি বিভাগটির Passing a dict instead of a listএকটি ডিক ব্যবহার করে একটি উদাহরণ দরকার, একটি তালিকা নয়।
আনতুবু

4
@ ইউন্টবু আমি dictউদাহরণটি ঠিক করে রেখেছি , thx। যে কারণটি lvlহল একটি শ্রেণিবদ্ধ সূচক এবং catsকেবল একটি তালিকা। শ্রেণীবদ্ধ ধরণের দ্বারা গোষ্ঠীকরণ করার সময়, অনুপস্থিত বিভাগগুলি যথাযথ যেখানে শূন্য এবং নাল দিয়ে পূর্ণ হয়। এটি দেখুন
piRSquared
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.