একটি পান্ডায় একটি সারির সূচক পাওয়া ফাংশন প্রয়োগ করে


121

আমি DataFrameপান্ডার পুরো জুড়ে প্রয়োগ করা একটি ক্রিয়ায় একটি সারির সূচকটি অ্যাক্সেস করার চেষ্টা করছি । আমার এরকম কিছু রয়েছে:

df = pandas.DataFrame([[1,2,3],[4,5,6]], columns=['a','b','c'])
>>> df
   a  b  c
0  1  2  3
1  4  5  6

এবং আমি একটি ফাংশন সংজ্ঞায়িত করব যা প্রদত্ত সারি সহ উপাদানগুলিতে অ্যাক্সেস করে

def rowFunc(row):
    return row['a'] + row['b'] * row['c']

আমি এটি এর মতো প্রয়োগ করতে পারি:

df['d'] = df.apply(rowFunc, axis=1)
>>> df
   a  b  c   d
0  1  2  3   7
1  4  5  6  34

অসাধারণ! এখন যদি আমি সূচকটি আমার ফাংশনে অন্তর্ভুক্ত করতে চাই? DataFrameযোগ করার আগে এতে প্রদত্ত যে কোনও সারির সূচীটি dহবে Index([u'a', u'b', u'c', u'd'], dtype='object')তবে আমি 0 এবং 1 চাই So সুতরাং আমি কেবল অ্যাক্সেস করতে পারি না row.index

আমি জানি যে আমি যে টেবিলটিতে সূচকটি সঞ্চয় করি সেখানে একটি অস্থায়ী কলাম তৈরি করতে পারতাম, তবে আমি ভাবছি যে এটি কোথাও সারি অবজেক্টে সঞ্চিত আছে।


1
পাশাপাশি: আপনার ব্যবহার করার কোনও কারণ আছে apply? এটি ফ্রেমে নিজেই ভেক্টরাইজড অপ্স সম্পাদন করার চেয়ে অনেক ধীর। (কখনও কখনও প্রয়োগ হ'ল কিছু করার সহজ উপায়, এবং পারফরম্যান্স বিবেচনাগুলি প্রায়শই অতিরঞ্জিত হয় তবে আপনার বিশেষ উদাহরণের জন্য এটি ব্যবহার না করা তত সহজ ))
ডিএসএম

1
বাস্তবে @ ডিএসএম আমি বিভিন্ন সারির উপাদান ব্যবহার করে প্রতিটি সারির জন্য আরেকটি অবজেক্ট কনস্ট্রাক্টরকে কল করছি। আমি প্রশ্নটি বর্ণনা করার জন্য একসাথে একটি ন্যূনতম উদাহরণ স্থাপন করতে চেয়েছিলাম।
মাইক 17

উত্তর:


148

এই ক্ষেত্রে সূচক অ্যাক্সেস করতে আপনি nameবৈশিষ্ট্যটি অ্যাক্সেস করতে পারেন :

In [182]:

df = pd.DataFrame([[1,2,3],[4,5,6]], columns=['a','b','c'])
def rowFunc(row):
    return row['a'] + row['b'] * row['c']

def rowIndex(row):
    return row.name
df['d'] = df.apply(rowFunc, axis=1)
df['rowIndex'] = df.apply(rowIndex, axis=1)
df
Out[182]:
   a  b  c   d  rowIndex
0  1  2  3   7         0
1  4  5  6  34         1

নোট করুন যে এটি যদি আপনি যা করতে চেষ্টা করছেন তা নীচে কাজ করে যা খুব দ্রুত:

In [198]:

df['d'] = df['a'] + df['b'] * df['c']
df
Out[198]:
   a  b  c   d
0  1  2  3   7
1  4  5  6  34

In [199]:

%timeit df['a'] + df['b'] * df['c']
%timeit df.apply(rowIndex, axis=1)
10000 loops, best of 3: 163 µs per loop
1000 loops, best of 3: 286 µs per loop

সম্পাদনা

এই প্রশ্নটি 3+ বছর পরে দেখে আপনি কেবল এটি করতে পারেন:

In[15]:
df['d'],df['rowIndex'] = df['a'] + df['b'] * df['c'], df.index
df

Out[15]: 
   a  b  c   d  rowIndex
0  1  2  3   7         0
1  4  5  6  34         1

তবে ধরে নেওয়া যে এটি এর চেয়ে তুচ্ছ নয়, আপনার rowFuncসত্যিকারের যা কিছু করা হচ্ছে, আপনার ভেক্টরাইজড ফাংশনগুলি ব্যবহার করা উচিত এবং তারপরে এগুলি ডিএফ সূচকের বিপরীতে ব্যবহার করুন:

In[16]:
df['newCol'] = df['a'] + df['b'] + df['c'] + df.index
df

Out[16]: 
   a  b  c   d  rowIndex  newCol
0  1  2  3   7         0       6
1  4  5  6  34         1      16

nameএর ক্ষেত্রে যদি নামকরণযুক্ত টিপল হয় তবে ভাল হবে Multindex, যাতে একটি নির্দিষ্ট সূচী স্তরটির নামটি অনুসন্ধান করা যায়।
কনস্টান্টিন

18

উভয় ক্ষেত্রেই:

1. কল row.nameভিতরে ভিতরে apply(..., axis=1):

df = pandas.DataFrame([[1,2,3],[4,5,6]], columns=['a','b','c'], index=['x','y'])

   a  b  c
x  1  2  3
y  4  5  6

df.apply(lambda row: row.name, axis=1)

x    x
y    y

2. সহ iterrows()(ধীর)

ডেটাফ্রেম.ইটারোস () আপনাকে সারিগুলিতে পুনরাবৃত্তি করতে এবং তাদের সূচি অ্যাক্সেস করতে দেয়:

for idx, row in df.iterrows():
    ...

2
: এবং যদি সংশ্লিষ্ট, 'itertuples' সাধারণত অনেক ভালো সঞ্চালিত stackoverflow.com/questions/24870953/...
dpb

6

মূল প্রশ্নের উত্তর দিতে: হ্যাঁ, আপনি একটি সারিটির সূচক মানটি অ্যাক্সেস করতে পারেন apply()। এটি কী এর অধীনে উপলব্ধ nameএবং আপনার নির্দিষ্ট করা দরকার axis=1(কারণ ল্যাম্বদা একটি সারির কলামগুলিকে প্রসেস করে না কলামের সারিগুলিতে)।

কার্যকারী উদাহরণ (প্যান্ডাস 0.23.4):

>>> import pandas as pd
>>> df = pd.DataFrame([[1,2,3],[4,5,6]], columns=['a','b','c'])
>>> df.set_index('a', inplace=True)
>>> df
   b  c
a      
1  2  3
4  5  6
>>> df['index_x10'] = df.apply(lambda row: 10*row.name, axis=1)
>>> df
   b  c  index_x10
a                 
1  2  3         10
4  5  6         40

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