एक पांडा में एक पंक्ति का सूचकांक प्राप्त करना फ़ंक्शन को लागू करता है


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 चाहिए। इसलिए मैं अभी एक्सेस नहीं कर सकता row.index

मुझे पता है कि मैं तालिका में एक अस्थायी स्तंभ बना सकता हूं जहां मैं सूचकांक को संग्रहीत करता हूं, लेकिन मैं सोच रहा हूं कि क्या यह कहीं पंक्ति वस्तु में संग्रहीत है।


1
एक तरफ: वहाँ एक कारण आप का उपयोग करने की आवश्यकता है apply? यह फ्रेम पर ही वेक्टर ऑप्स प्रदर्शन करने की तुलना में बहुत धीमा है। (कभी-कभी आवेदन कुछ करने का सबसे सरल तरीका है, और प्रदर्शन के विचार अक्सर अतिरंजित होते हैं, लेकिन आपके विशेष उदाहरण के लिए इसका उपयोग करना आसान नहीं है।)
DSM

1
वास्तविकता में @DSM मैं अलग पंक्ति तत्वों का उपयोग करके प्रत्येक पंक्ति के लिए एक और ऑब्जेक्ट्स कंस्ट्रक्टर को बुला रहा हूं। मैं सिर्फ प्रश्न को स्पष्ट करने के लिए एक न्यूनतम उदाहरण को एक साथ रखना चाहता था।
माइक

जवाबों:


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()(धीमे) के साथ

DataFrame.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
इसके अलावा मल्टीफंडेक्स के साथ डेटाफ्रेम के लिए काम करता है: row.name एक ट्यूपल बन जाता है।
चार्ल्स फॉक्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.