পান্ডসে মানচিত্র, প্রয়োগচিত্র এবং প্রয়োগের পদ্ধতিগুলির মধ্যে পার্থক্য


465

আপনি কি আমাকে বলতে পারবেন কখন এই ভেক্টরাইজেশন পদ্ধতিগুলি মৌলিক উদাহরণ সহ ব্যবহার করবেন?

আমি দেখতে পাচ্ছি যে mapএটি একটি Seriesপদ্ধতি যেখানে বাকী DataFrameঅংশগুলি। যদিও আমি সম্পর্কে applyএবং applymapপদ্ধতি সম্পর্কে বিভ্রান্ত হয়ে পড়েছিলাম । ডেটাফ্রেমে কোনও ফাংশন প্রয়োগের জন্য কেন আমাদের দুটি পদ্ধতি আছে? আবার, সাধারণ উদাহরণগুলি যা ব্যবহারের বর্ণনা দেয় তা দুর্দান্ত হবে!


5
আমি ভুল হলে আমাকে সংশোধন করুন, তবে আমি বিশ্বাস করি যে এই ফাংশনগুলি ভেক্টরাইজিং পদ্ধতিগুলি নয় কারণ এগুলি সমস্ত প্রয়োগ করা হয় এমন উপাদানগুলির উপর একটি লুপ জড়িত।
টাঙ্গুয়

1
আমি এখানে কোনও পার্থক্য দেখতে পাচ্ছি না: gist.github.com/MartinThoma/e320cbb937afb4ff766f75988f1c65e6
মার্টিন থোমা

উত্তর:


532

ডেটা অ্যানালাইসিস বইয়ের জন্য ওয়েস ম্যাককিনির পাইথন থেকে সরাসরি , পৃষ্ঠা। 132 (আমি এই বইটির উচ্চ প্রস্তাব দিয়েছি):

আর একটি ঘন ঘন অপারেশন প্রতিটি কলাম বা সারিতে 1 ডি অ্যারেতে একটি ফাংশন প্রয়োগ করছে। ডেটাফ্রেমের প্রয়োগ পদ্ধতি হুবহু এটি করে:

In [116]: frame = DataFrame(np.random.randn(4, 3), columns=list('bde'), index=['Utah', 'Ohio', 'Texas', 'Oregon'])

In [117]: frame
Out[117]: 
               b         d         e
Utah   -0.029638  1.081563  1.280300
Ohio    0.647747  0.831136 -1.549481
Texas   0.513416 -0.884417  0.195343
Oregon -0.485454 -0.477388 -0.309548

In [118]: f = lambda x: x.max() - x.min()

In [119]: frame.apply(f)
Out[119]: 
b    1.133201
d    1.965980
e    2.829781
dtype: float64

সর্বাধিক প্রচলিত অ্যারের পরিসংখ্যান (সমষ্টি এবং গড়ের মতো) হ'ল ডেটা ফ্রেম পদ্ধতি, সুতরাং প্রয়োগ ব্যবহার করা প্রয়োজন হয় না।

এলিমেন্ট-ভিত্তিক পাইথন ফাংশনগুলিও ব্যবহার করা যেতে পারে। মনে করুন আপনি ফ্রেমে প্রতিটি ভাসমান পয়েন্টের মান থেকে একটি বিন্যাসিত স্ট্রিং গণনা করতে চেয়েছিলেন। আপনি এপ্লাইম্যাপ দিয়ে এটি করতে পারেন:

In [120]: format = lambda x: '%.2f' % x

In [121]: frame.applymap(format)
Out[121]: 
            b      d      e
Utah    -0.03   1.08   1.28
Ohio     0.65   0.83  -1.55
Texas    0.51  -0.88   0.20
Oregon  -0.49  -0.48  -0.31

নাম প্রয়োগের মানচিত্রটির কারণ হ'ল সিরিজটিতে উপাদান-ভিত্তিক কার্য প্রয়োগের জন্য একটি মানচিত্র পদ্ধতি রয়েছে:

In [122]: frame['e'].map(format)
Out[122]: 
Utah       1.28
Ohio      -1.55
Texas      0.20
Oregon    -0.31
Name: e, dtype: object

সারসংক্ষেপ করা, applyএকটি DataFrame একটি সারি / কলাম ভিত্তিতে কাজ করে, applymapএকটি DataFrame উপর উপাদান-অনুযায়ী কাজ করে, এবং mapসিরিজ উপর কাজ করে উপাদান প্রজ্ঞাময়।


31
কঠোরভাবে বলতে গেলে, প্রয়োগ ম্যাপটি অভ্যন্তরীণভাবে প্রয়োগ করা হবে কিছুটা মোড়ানো-ওভার পাস ফাংশন প্যারামিটারের মাধ্যমে প্রয়োগ করা (রাউলি বদলে প্রতিস্থাপন funcকরা lambda x: [func(y) for y in x], এবং কলাম অনুসারে প্রয়োগ)
এলোকো

5
ব্যাখ্যার জন্য ধন্যবাদ. যেহেতু mapএবং applymapউভয়ই উপাদান অনুসারে কাজ করে, আমি একটি একক পদ্ধতি (উভয় mapবা applymap) প্রত্যাশা করব যা সিরিজ এবং ডেটাফ্রেমের জন্য উভয়ই কার্যকর হবে। সম্ভবত অন্যান্য নকশা বিবেচনা আছে, এবং ওয়েস ম্যাককিনি দুটি পৃথক পদ্ধতি নিয়ে আসার সিদ্ধান্ত নিয়েছে।
মেরিলিয়ন

2
এটি কোনও কারণে আমার অনুলিপিটির 129 পৃষ্ঠায় রয়েছে। দ্বিতীয় সংস্করণ বা কোনও কিছুর জন্য কোনও লেবেল নেই।
জয়দি

1
পান্ডাসে ফাংশন applymapসহ কী কী উপায় আছে groupby?
everestial007

গ্রুপযুক্ত কলামওয়ালা ডেটাতে কোনও ফাংশন কীভাবে প্রয়োগ করবেন?
এইচএইচ

80

তুলনা map, applymapএবং : প্রসঙ্গ ম্যাটার্সapply

প্রথম প্রধান পার্থক্য: সংজ্ঞা

  • map কেবল সিরিজটিতে সংজ্ঞায়িত করা হয়েছে
  • applymap শুধুমাত্র ডেটাফ্রেমে সংজ্ঞায়িত করা হয়
  • apply উভয় সংজ্ঞায়িত করা হয়

দ্বিতীয় প্রধান পার্থক্য: ইনপুট যুক্তি

  • mapdicts, Seriesবা কলযোগ্য গ্রহণ করে
  • applymapএবং applyকেবল কলযোগ্য গ্রহণ করুন

তৃতীয় প্রধান পার্থক্য: আচরণ

  • map সিরিজ জন্য মৌলিক দিক
  • applymap ডেটাফ্রেমগুলির জন্য এলিমেন্টাইজড
  • applyএছাড়াও প্রাথমিকভাবে কাজ করে তবে আরও জটিল ক্রিয়াকলাপ এবং সংহতকরণের জন্য এটি উপযুক্ত। আচরণ এবং রিটার্ন মান ফাংশনের উপর নির্ভর করে।

চতুর্থ প্রধান পার্থক্য (সর্বাধিক গুরুত্বপূর্ণ এক): ইউএসই کیس

  • mapএক ডোমেন থেকে অন্য ডোমেনে মান ম্যাপিংয়ের জন্য বোঝানো হয় তাই পারফরম্যান্সের জন্য অনুকূলিত করা হয় (যেমন, df['A'].map({1:'a', 2:'b', 3:'c'}))
  • applymapএকাধিক সারি / কলাম জুড়ে উপাদান হিসাবে রূপান্তরগুলির জন্য ভাল (যেমন, df[['A', 'B', 'C']].applymap(str.strip))
  • applyভেক্টরাইজ করা যায় না এমন কোনও ফাংশন প্রয়োগের জন্য (যেমন, df['sentences'].apply(nltk.sent_tokenize))

সংক্ষেপিত

এখানে চিত্র বর্ণনা লিখুন

পাদটিকা

  1. mapযখন একটি অভিধান পাস / সিরিজ সেই অভিধান / সিরিজের কীগুলির উপর ভিত্তি করে উপাদানগুলির মানচিত্র তৈরি করে। অনুপস্থিত মানগুলি আউটপুটে NaN হিসাবে রেকর্ড করা হবে।
  2. applymapআরও সাম্প্রতিক সংস্করণে কিছু অপারেশনের জন্য অনুকূলিত করা হয়েছে। আপনি কিছু ক্ষেত্রে applymapতুলনায় সামান্য দ্রুত পাবেন apply। আমার পরামর্শটি হ'ল তাদের উভয়কেই পরীক্ষা করা এবং যা ভাল কাজ করে তা ব্যবহার করা।

  3. mapএলিমেন্টওয়ালা ম্যাপিং এবং রূপান্তরকরণের জন্য অনুকূলিত। অভিধান বা সিরিজ জড়িত অপারেশনগুলি পারফরম্যান্সের জন্য আরও ভাল পারফরম্যান্সের জন্য দ্রুত কোড পাথ ব্যবহার করতে প্যান্ডাকে সক্ষম করবে।

  4. Series.applyঅন্যথায় সিরিজ একত্রিত করার জন্য একটি স্কেলার ফিরিয়ে দেয়। একইভাবে DataFrame.apply। লক্ষ্য করুন applyযখন যেমন নির্দিষ্ট NumPy ফাংশন সঙ্গে বলা এছাড়াও fastpaths হয়েছে mean, sumইত্যাদি

70

এই উত্তরগুলিতে দুর্দান্ত তথ্য রয়েছে, তবে কোন পদ্ধতিগুলি অ্যারে-ওয়াইস বনাম উপাদান-ভিত্তিতে কাজ করে তা পরিষ্কারভাবে সংক্ষিপ্ত করতে আমি নিজের নিজস্ব যুক্ত করছি। জেরেমিয়াবুদ্ধ বেশিরভাগ ক্ষেত্রে এটি করেছিলেন তবে সিরিজ.প্লাইয়ের উল্লেখ করেননি। আমার কাছে মন্তব্য করার মতামত নেই।

  • DataFrame.apply একসাথে পুরো সারি বা কলামগুলিতে পরিচালনা করে।

  • DataFrame.applymap, Series.applyএবং Series.mapএকটি সময়ে উপাদান পরিচালনা করে।

এর ক্ষমতা Series.applyএবং এর মধ্যে প্রচুর ওভারল্যাপ রয়েছে Series.mapযার অর্থ হয় যে কোনও একটি বেশিরভাগ ক্ষেত্রে কাজ করবে। তাদের কিছুটা হলেও সামান্য পার্থক্য রয়েছে, যার কয়েকটি ওসার উত্তরে আলোচনা হয়েছিল।


38

অন্যান্য উত্তর যোগ করার পদ্ধতি, একটি Seriesএছাড়াও আছে মানচিত্র এবং আবেদন

প্রয়োগ একটি সিরিজ থেকে একটি ডেটা ফ্রেম তৈরি করতে পারে ; তবে মানচিত্রটি কেবলমাত্র অন্য সিরিজের প্রতিটি ঘরে একটি সিরিজ রাখবে যা সম্ভবত আপনি চান তা নয়।

In [40]: p=pd.Series([1,2,3])
In [41]: p
Out[31]:
0    1
1    2
2    3
dtype: int64

In [42]: p.apply(lambda x: pd.Series([x, x]))
Out[42]: 
   0  1
0  1  1
1  2  2
2  3  3

In [43]: p.map(lambda x: pd.Series([x, x]))
Out[43]: 
0    0    1
1    1
dtype: int64
1    0    2
1    2
dtype: int64
2    0    3
1    3
dtype: int64
dtype: object

এছাড়াও যদি আমার "পার্শ্ব প্রতিক্রিয়া যেমন" একটি ওয়েব সার্ভারের সাথে সংযুক্ত করুন "এর মতো পার্শ্ব প্রতিক্রিয়াগুলির সাথে আমার কোনও ফাংশন থাকে তবে আমি সম্ভবত applyস্পষ্টতার জন্য ব্যবহার করতাম ।

series.apply(download_file_for_every_element) 

Mapকেবল কোনও ফাংশনই নয়, অভিধান বা অন্য একটি সিরিজও ব্যবহার করতে পারে। বলি আপনি অনুমতিগুলি চালিত করতে চান ।

গ্রহণ করা

1 2 3 4 5
2 1 4 5 3

এই আদেশের বর্গক্ষেত্র হয়

1 2 3 4 5
1 2 5 3 4

আপনি এটি ব্যবহার করে গণনা করতে পারেন map। স্ব-প্রয়োগ নথিবদ্ধ কিনা তা নিশ্চিত নয়, তবে এটি কাজ করে 0.15.1

In [39]: p=pd.Series([1,0,3,4,2])

In [40]: p.map(p)
Out[40]: 
0    0
1    1
2    4
3    2
4    3
dtype: int64

3
এছাড়াও .apply () আপনাকে কোয়ার্গসে ফাংশনে প্রবেশ করতে দেয় যখন। ম্যাপ () না করে।
neilxdims

19

@ জেরেমিয়াবুদ্ধ উল্লেখ করেছেন যে প্রয়োগটি সারি / কলামগুলিতে কাজ করে, অন্যদিকে অ্যাপ্লিকেশনটি উপাদান অনুসারে কাজ করে। তবে মনে হচ্ছে আপনি এখনও উপাদান-ভিত্তিক গণনার জন্য প্রয়োগ ব্যবহার করতে পারেন ....

    frame.apply(np.sqrt)
    Out[102]: 
                   b         d         e
    Utah         NaN  1.435159       NaN
    Ohio    1.098164  0.510594  0.729748
    Texas        NaN  0.456436  0.697337
    Oregon  0.359079       NaN       NaN

    frame.applymap(np.sqrt)
    Out[103]: 
                   b         d         e
    Utah         NaN  1.435159       NaN
    Ohio    1.098164  0.510594  0.729748
    Texas        NaN  0.456436  0.697337
    Oregon  0.359079       NaN       NaN

29
এই সঙ্গে ভাল ধরা। এটি আপনার উদাহরণে কাজ করার কারণটি হ'ল এনপি.এসকিআরটি একটি ইউফুঙ্ক, অর্থাত্ যদি আপনি এটি অ্যারে দেন তবে এটি অ্যারের প্রতিটি উপাদানগুলিতে স্কয়ার্ট ফাংশন সম্প্রচার করবে। সুতরাং যখন প্রতিটি কলামে pushes np.sqrt প্রয়োগ করবেন, np.sqrt কলামের প্রতিটি উপাদানের উপর নিজেকে কাজ করে, সুতরাং আপনি মূলত প্রয়োগ ম্যাপ হিসাবে একই ফলাফল পাচ্ছেন।
জেরেমিয়াবুদ্ধ

11

আমি কেবল এটি চিহ্নিত করতে চেয়েছিলাম, যেমন আমি এটির জন্য কিছুটা লড়াই করেছি

def f(x):
    if x < 0:
        x = 0
    elif x > 100000:
        x = 100000
    return x

df.applymap(f)
df.describe()

এটি নিজেই ডেটাফ্রেমে পরিবর্তন করে না, পুনরায় নিয়োগ দিতে হবে

df = df.applymap(f)
df.describe()

1
Df দিয়ে কিছু করার পরে আপনাকে পুনরায় নিয়োগ দিতে হবে কিনা তা জানার ক্ষেত্রে আমার মাঝে মাঝে সমস্যা হয়। এটি বেশিরভাগ ক্ষেত্রে আমার জন্য পরীক্ষা এবং ত্রুটি, তবে আমি বাজি ধরছি যে এটি কীভাবে কাজ করে তার একটি যুক্তি রয়েছে (যে আমি মিস করছি)।
মেরিলিয়ন

2
সাধারণভাবে, একটি পান্ডাস ডেটাফ্রেম কেবল পুনরায় নিয়োগের মাধ্যমে df = modified_dfবা আপনি inplace=Trueপতাকা নির্ধারণের মাধ্যমে সংশোধিত হয় । আপনি একটি dataframe একটি ফাংশন রেফারেন্স এবং ফাংশন মডিফাই দ্বারা dataframe পাস এছাড়াও dataframe পরিবর্তন করতে হবে
মিউয়ন

1
এটি সম্পূর্ণ সত্য নয়, ভাবুন .ixবা .whereইত্যাদি sure নিশ্চিত হন না যে কখন আপনাকে পুনরায় নিয়োগের প্রয়োজন হবে এবং কখন নয় তার পুরো ব্যাখ্যাটি।
থানোস

10

সম্ভবত সহজ ব্যাখ্যা প্রয়োগ এবং প্রয়োগের মানচিত্রের মধ্যে পার্থক্য:

প্রয়োগ পুরো কলামটিকে প্যারামিটার হিসাবে নেয় এবং তারপরে ফলাফলটি এই কলামে বরাদ্দ করে

প্রয়োগম্যাপটি পৃথক কক্ষের মানটিকে প্যারামিটার হিসাবে গ্রহণ করে এবং ফলাফলটি এই ঘরে পুনরায় নির্ধারণ করে।

এনবি যদি প্রয়োগ করে তবে একক মান প্রদান করে আপনি নির্ধারিত হওয়ার পরে কলামের পরিবর্তে এই মানটি পাবেন এবং শেষ পর্যন্ত ম্যাট্রিক্সের পরিবর্তে কেবল একটি সারি থাকবে।


3

আমার বোঝার:

কার্যক্ষেত্রের দৃষ্টিকোণ থেকে:

যদি ফাংশনটিতে ভেরিয়েবল থাকে যা একটি কলাম / সারিটির মধ্যে তুলনা করা দরকার, ব্যবহার করুন apply

উদাহরণ: lambda x: x.max()-x.mean()

যদি প্রতিটি উপাদানটিতে ফাংশন প্রয়োগ করতে হয়:

1> যদি একটি কলাম / সারিটি অবস্থিত থাকে তবে ব্যবহার করুন apply

2> যদি পুরো ডেটাফ্রেমে প্রয়োগ হয় তবে ব্যবহার করুন applymap

majority = lambda x : x > 17
df2['legal_drinker'] = df2['age'].apply(majority)

def times10(x):
  if type(x) is int:
    x *= 10 
  return x
df2.applymap(times10)

আরও ভাল স্পষ্টতার জন্য দয়া করে df2 সরবরাহ করুন যাতে আমরা আপনার কোডটি পরীক্ষা করতে পারি।
আশীষ আনন্দ

1

সিএস 95 এর উত্তরের ভিত্তিতে

  • map কেবল সিরিজটিতে সংজ্ঞায়িত করা হয়েছে
  • applymap শুধুমাত্র ডেটাফ্রেমে সংজ্ঞায়িত করা হয়
  • apply উভয় সংজ্ঞায়িত করা হয়

কিছু উদাহরণ দিন

In [3]: frame = pd.DataFrame(np.random.randn(4, 3), columns=list('bde'), index=['Utah', 'Ohio', 'Texas', 'Oregon'])

In [4]: frame
Out[4]:
            b         d         e
Utah    0.129885 -0.475957 -0.207679
Ohio   -2.978331 -1.015918  0.784675
Texas  -0.256689 -0.226366  2.262588
Oregon  2.605526  1.139105 -0.927518

In [5]: myformat=lambda x: f'{x:.2f}'

In [6]: frame.d.map(myformat)
Out[6]:
Utah      -0.48
Ohio      -1.02
Texas     -0.23
Oregon     1.14
Name: d, dtype: object

In [7]: frame.d.apply(myformat)
Out[7]:
Utah      -0.48
Ohio      -1.02
Texas     -0.23
Oregon     1.14
Name: d, dtype: object

In [8]: frame.applymap(myformat)
Out[8]:
            b      d      e
Utah     0.13  -0.48  -0.21
Ohio    -2.98  -1.02   0.78
Texas   -0.26  -0.23   2.26
Oregon   2.61   1.14  -0.93

In [9]: frame.apply(lambda x: x.apply(myformat))
Out[9]:
            b      d      e
Utah     0.13  -0.48  -0.21
Ohio    -2.98  -1.02   0.78
Texas   -0.26  -0.23   2.26
Oregon   2.61   1.14  -0.93


In [10]: myfunc=lambda x: x**2

In [11]: frame.applymap(myfunc)
Out[11]:
            b         d         e
Utah    0.016870  0.226535  0.043131
Ohio    8.870453  1.032089  0.615714
Texas   0.065889  0.051242  5.119305
Oregon  6.788766  1.297560  0.860289

In [12]: frame.apply(myfunc)
Out[12]:
            b         d         e
Utah    0.016870  0.226535  0.043131
Ohio    8.870453  1.032089  0.615714
Texas   0.065889  0.051242  5.119305
Oregon  6.788766  1.297560  0.860289

0

FOMO:

নিম্নলিখিত উদাহরণগুলি দেখায় applyএবং applymapএটিকে প্রয়োগ করা হয় DataFrame

mapফাংশন এমন কিছু যা আপনি কেবল সিরিজে প্রয়োগ করেন। আপনি map ডেটাফ্রেমে আবেদন করতে পারবেন না ।

মনে রাখা জিনিস যে applyকি করতে পারেন কিছু applymap করতে পারেন, কিন্তু applyআছে অতিরিক্ত অপশন।

এক্স ফ্যাক্টর বিকল্পগুলি: axisএবং result_typeযেখানে result_typeকেবলমাত্র axis=1(কলামগুলির জন্য) যখন কাজ করে ।

df = DataFrame(1, columns=list('abc'),
                  index=list('1234'))
print(df)

f = lambda x: np.log(x)
print(df.applymap(f)) # apply to the whole dataframe
print(np.log(df)) # applied to the whole dataframe
print(df.applymap(np.sum)) # reducing can be applied for rows only

# apply can take different options (vs. applymap cannot)
print(df.apply(f)) # same as applymap
print(df.apply(sum, axis=1))  # reducing example
print(df.apply(np.log, axis=1)) # cannot reduce
print(df.apply(lambda x: [1, 2, 3], axis=1, result_type='expand')) # expand result

সিডনোট হিসাবে, সিরিজ mapফাংশনটি পাইথন mapফাংশনের সাথে বিভ্রান্ত হওয়া উচিত নয় ।

মানচিত্রটি মানচিত্রের জন্য প্রথমটি সিরিজটিতে প্রয়োগ করা হয় এবং দ্বিতীয়টি পুনরাবৃত্ত হওয়ার প্রতিটি আইটেমে ব্যবহৃত হয়।


শেষ পর্যন্ত গ্রুপফাই applyপদ্ধতিতে ডেটা ফ্রেম পদ্ধতিটি গুলিয়ে ফেলবেন না apply

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