পান্ডস: আমি কীভাবে একক কলামের জন্য প্রয়োগ () ফাংশনটি ব্যবহার করতে পারি?


254

আমার কাছে দুটি কলাম সহ একটি পান্ডাস ডেটা ফ্রেম রয়েছে। দ্বিতীয়টিটিকে প্রভাবিত না করেই আমাকে প্রথম কলামের মানগুলি পরিবর্তন করতে হবে এবং কেবলমাত্র প্রথম কলামের মান পরিবর্তিত করে পুরো ডেটা ফ্রেম ফিরিয়ে আনতে হবে। পান্ডায় প্রয়োগ করে আমি কীভাবে এটি করতে পারি?


4
দয়া করে কিছু ইনপুট নমুনা ডেটা এবং পছন্দসই আউটপুট পোস্ট করুন।
ফ্যাবিও লামানা

আপনার applyএইরকম পরিস্থিতিতে কখনও ব্যবহার করা উচিত নয় । পরিবর্তে কলামে সরাসরি অপারেট করুন।
টেড পেট্রো

টেড পেট্রো applyযেমন বলেছিলেন, যথাসম্ভব ব্যবহার করা এড়িয়ে চলুন । আপনার যদি এটির নিশ্চিত হওয়া না হয় তবে আপনি সম্ভবত এটি ব্যবহার করবেন না। আমি কখন একবার আমার কোডে পান্ডা প্রয়োগ () ব্যবহার করতে চাই তা একবার দেখার পরামর্শ দিই?
cs95

প্রশ্নটি পুরোপুরি পরিষ্কার নয়: এটি কলামের প্রতিটি উপাদানগুলিতে কোনও ফাংশন প্রয়োগ করে বা পুরো কলামে কোনও ফাংশন প্রয়োগ করে (উদাহরণস্বরূপ: কলামটি বিপরীত করে)?
পিয়েরে আলবার্ডে

উত্তর:


336

একটি নমুনা ডেটা ফ্রেম dfহিসাবে দেওয়া হয়েছে:

a,b
1,2
2,3
3,4
4,5

আপনি যা চান তা হ'ল:

df['a'] = df['a'].apply(lambda x: x + 1)

যে ফিরে:

   a  b
0  2  2
1  3  3
2  4  4
3  5  5


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

14
আমি যখন এটি করার চেষ্টা করব তখন আমি নীচের সতর্কতাটি পেয়েছি: "একটি ডেটা ফ্রেমের একটি স্লাইসের অনুলিপিটিতে একটি মান সেট করার চেষ্টা করা হচ্ছে instead এর পরিবর্তে .loc [সারি_আইনডেক্সার, কল_ইন্ডেক্সার] = মান ব্যবহার করার চেষ্টা করুন"
ডাগরুন

24
কৌতূহলের বিষয় হিসাবে: কেন সেই পরিস্থিতিতে ব্যবহার করা উচিত নয়? পরিস্থিতি ঠিক কী?
চাচা বেন বেন

19
@ ইউনসেলবেন সাধারণভাবে applyসারিগুলির উপর একটি অভ্যন্তরীণ লুপ ব্যবহার করে যা ভেক্টরাইজড ফাংশনগুলির চেয়ে অনেক ধীরে ধীরে যেমন df.a = df.a / 2(মাইক মুলার উত্তর দেখুন)।
ফ্যাবিও লামান্না

66

একক কলামের জন্য আরও ভাল ব্যবহারের জন্য এটির map()মতো:

df = pd.DataFrame([{'a': 15, 'b': 15, 'c': 5}, {'a': 20, 'b': 10, 'c': 7}, {'a': 25, 'b': 30, 'c': 9}])

    a   b  c
0  15  15  5
1  20  10  7
2  25  30  9



df['a'] = df['a'].map(lambda a: a / 2.)

      a   b  c
0   7.5  15  5
1  10.0  10  7
2  12.5  30  9

78
কেন একক কলামের map()চেয়ে ভাল apply()?
চেইমজি

2
এটি খুব দরকারী ছিল। আমি এটি একটি কলামে সঞ্চিত পাথ থেকে ফাইলের নামগুলি বের করতে ব্যবহার করেছিdf['file_name'] = df['Path'].map(lambda a: os.path.basename(a))
mmann1123

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

3
@jpcgt এর অর্থ কি এই ক্ষেত্রে মানচিত্রটি প্রয়োগের চেয়ে দ্রুততর?
ভেরাগোস

@ChaimG আমি দেখি এই OS ভাল ব্যাখ্যা করে: stackoverflow.com/a/19798528/571828
象嘉道

40

আপনার কোনও ফাংশনের দরকার নেই। আপনি সরাসরি একটি সম্পূর্ণ কলামে কাজ করতে পারেন।

উদাহরণ ডেটা:

>>> df = pd.DataFrame({'a': [100, 1000], 'b': [200, 2000], 'c': [300, 3000]})
>>> df

      a     b     c
0   100   200   300
1  1000  2000  3000

কলামে সমস্ত মান a:

>>> df.a = df.a / 2
>>> df

     a     b     c
0   50   200   300
1  500  2000  3000

যদি আমি "/" দ্বারা কলামে প্রতিটি উপাদান বিভক্ত করতে এবং প্রথম অংশটি নিতে চাই?
47

12

যদিও প্রদত্ত প্রতিক্রিয়াগুলি সঠিক, তারা প্রাথমিক ডেটা ফ্রেমটি সংশোধন করে যা সর্বদা কাম্য নয় (এবং ওপিকে উদাহরণস্বরূপ "ব্যবহার apply" করার জন্য জিজ্ঞাসা করা হলেও এটি হতে পারে যে তারা এমন একটি সংস্করণ চেয়েছিল যা একটি নতুন ডেটা ফ্রেমকে ফিরিয়ে applyদেয়)।

এটি ব্যবহার করে এটি সম্ভব assign: assignডকুমেন্টেশন অনুযায়ী (এটি জোর আমার): এটি বিদ্যমান কলামগুলিতে বৈধ :

একটি ডেটা ফ্রেমে নতুন কলামগুলি বরাদ্দ করুন।

নতুনগুলি ছাড়াও সমস্ত আসল কলাম সহ একটি নতুন অবজেক্ট ফেরত দেয়। পুনরায় বরাদ্দ করা বিদ্যমান কলামগুলি ওভাররাইট করা হবে

সংক্ষেপে:

In [1]: import pandas as pd

In [2]: df = pd.DataFrame([{'a': 15, 'b': 15, 'c': 5}, {'a': 20, 'b': 10, 'c': 7}, {'a': 25, 'b': 30, 'c': 9}])

In [3]: df.assign(a=lambda df: df.a / 2)
Out[3]: 
      a   b  c
0   7.5  15  5
1  10.0  10  7
2  12.5  30  9

In [4]: df
Out[4]: 
    a   b  c
0  15  15  5
1  20  10  7
2  25  30  9

মনে রাখবেন যে ফাংশনটি পুরো ডেটাফ্রেমটি পাস করবে, কেবল যে কলামটি আপনি সংশোধন করতে চান তা নয়, তাই আপনার ল্যাম্বডায় সঠিক কলামটি নির্বাচন করেছেন তা নিশ্চিত করতে হবে।


9

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

import pandas as pd
import swifter

def fnc(m):
    return m*3+4

df = pd.DataFrame({"m": [1,2,3,4,5,6], "c": [1,1,1,1,1,1], "x":[5,3,6,2,6,1]})

# apply a self created function to a single column in pandas
df["y"] = df.m.swifter.apply(fnc)

এটি আপনার সমস্ত সিপিইউ কোরের ফলাফল গণনা করতে সক্ষম করবে তাই এটি স্বাভাবিক প্রয়োগ ফাংশনগুলির চেয়ে অনেক দ্রুত হবে। চেষ্টা করুন এবং আপনার জন্য এটি দরকারী হয়ে ওঠে তা আমাকে জানান।


1

ডেটটাইম ব্যবহার করে এবং নালাগুলি বা খালি জায়গাগুলি বিবেচনা করে একটি জটিল গণনার চেষ্টা করি। আমি একটি ডেটটাইম কলামে 30 বছর হ্রাস করছি এবং applyপদ্ধতিটি ব্যবহার করার পাশাপাশি lambdaডেটটাইম ফর্ম্যাটকে রূপান্তর করছি। লাইন if x != '' else xসেই অনুযায়ী সমস্ত খালি স্থান বা নালীর যত্ন নেবে।

df['Date'] = df['Date'].fillna('')
df['Date'] = df['Date'].apply(lambda x : ((datetime.datetime.strptime(str(x), '%m/%d/%Y') - datetime.timedelta(days=30*365)).strftime('%Y%m%d')) if x != '' else x)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.