DataFrame Index पर फ़ंक्शन लागू करें


84

पंडों के सूचकांक पर एक फ़ंक्शन लागू करने का सबसे अच्छा तरीका क्या है DataFrame? वर्तमान में मैं इस क्रिया दृष्टिकोण का उपयोग कर रहा हूं:

pd.DataFrame({"Month": df.reset_index().Date.apply(foo)})

Dateसूचकांक का नाम कहां है और fooउस फ़ंक्शन का नाम है जिसे मैं लागू कर रहा हूं।


6
df.index.map(foo)काम करता है ?
हाईवी

1
यह "काम करता है", लेकिन यह पंडों की श्रृंखला के बजाय एक शानदार सरणी देता है।
एलेक्स रोथबर्ग 1

1
आपका अंतिम लक्ष्य क्या है? आप सरणी को DataFrame कंस्ट्रक्टर में पास कर सकते हैं। या कुछ ऐसा करेंpd.Series(df.index).apply(foo)
रोमन पाकर

यह पूरी तरह से निर्भर करता है कि कार्य क्या है ...
एंडी हेडन

1
यदि आप सिर्फ एक मौजूदा DataFrame के सूचकांक को संशोधित करना चाहते हैं, तो @HYRY से अनुसरण कर सकते हैंdf.index = df.index.map(foo)
बेन

जवाबों:


99

जैसा कि पहले से ही HYRY द्वारा टिप्पणियों में सुझाया गया है , Series.map यहां जाने का तरीका है। बस परिणामी श्रृंखला के लिए सूचकांक सेट करें।

सरल उदाहरण:

df = pd.DataFrame({'d': [1, 2, 3]}, index=['FOO', 'BAR', 'BAZ'])
df
        d
FOO     1
BAR     2
BAZ     3

df.index = df.index.map(str.lower)
df
        d
foo     1
bar     2
baz     3

सूचकांक! = श्रृंखला

जैसा कि @OP द्वारा बताया गया है। df.index.map(str.lower)कॉल एक numpy सरणी देता है। ऐसा इसलिए है क्योंकि डेटाफ्रेम इंडेक्स श्रृंखला के नहीं, बल्कि खस्ता सरणियों पर आधारित हैं

इंडेक्स को सीरीज़ में बनाने का एकमात्र तरीका इससे एक सीरीज़ बनाना है।

pd.Series(df.index.map(str.lower))

चेतावनी

Indexवर्ग अब उपवर्गों StringAccessorMixin, जिसका अर्थ है कि आप ऊपर आपरेशन के रूप में निम्नानुसार कर सकते हैं

df.index.str.lower()

यह अभी भी एक श्रृंखला नहीं बल्कि एक सूचकांक वस्तु का उत्पादन करता है।


1
मल्टी-इंडेक्स के साथ, आप स्लाइसिंग का उपयोग कर सकते हैं यदि आप अपने फ़ंक्शन, जैसे x[0]और दोनों वस्तुओं का उपयोग करना चाहते हैं x[1]
इलियट

3
थोड़ा छोटा रास्ताdf.index.map(str.lower)
शून्य

1
@ जॉनगल्ट ने इसे इंगित करने के लिए धन्यवाद दिया। यह न केवल छोटा है, बल्कि तेज है, क्योंकि str.lower एक संकलित साइथन फ़ंक्शन है और मैंने जो लंबोदा फ़ंक्शन लिखा है वह नहीं है।
फायरलैक्सएक्स

12

यह मानते हुए कि आप अपने फ़ंक्शन "फू" को अनुक्रमणिका पर लागू करके वर्तमान DataFrame में एक कॉलम बनाना चाहते हैं। आप लिख सकते हैं ...

df['Month'] = df.index.map(foo)

अकेले श्रृंखला उत्पन्न करने के लिए आप कर सकते हैं ...

pd.Series({x: foo(x) for x in foo.index})

1
पांडा / सुन्न इको-सिस्टम में लूप के लिए उपयोग करना अत्यधिक हतोत्साहित करता है। यह बहुत स्मृति अक्षम है और आसानी से बड़े डेटासेट के साथ क्रैश हो जाता है।

3

बहुत सारे उत्तर सूचकांक को एक सरणी के रूप में वापस कर रहे हैं, जो सूचकांक नाम आदि के बारे में जानकारी खो देता है (हालांकि आप कर सकते थे pd.Series(index.map(myfunc), name=index.name))। यह भी एक MultiIndex के लिए काम नहीं करेगा।

जिस तरह से मैंने इसके साथ काम किया वह "नाम बदलना" है:

mix = pd.MultiIndex.from_tuples([[1, 'hi'], [2, 'there'], [3, 'dude']], names=['num', 'name'])
data = np.random.randn(3)
df = pd.Series(data, index=mix)
print(df)
num  name 
1    hi       1.249914
2    there   -0.414358
3    dude     0.987852
dtype: float64

# Define a few dictionaries to denote the mapping
rename_dict = {i: i*100 for i in df.index.get_level_values('num')}
rename_dict.update({i: i+'_yeah!' for i in df.index.get_level_values('name')})
df = df.rename(index=rename_dict)
print(df)
num  name       
100  hi_yeah!       1.249914
200  there_yeah!   -0.414358
300  dude_yeah!     0.987852
dtype: float64

इसके साथ एकमात्र चाल यह है कि आपके सूचकांक में अलग-अलग मल्टींडेक्स स्तरों के अनूठे लेबल बी / डब्ल्यू होने की जरूरत है, लेकिन हो सकता है कि मुझसे ज्यादा चालाक कोई और जानता हो कि उसे कैसे प्राप्त करना है। मेरे उद्देश्यों के लिए यह समय का 95% काम करता है।


3

आप हमेशा अपनी वरीयताओं / जरूरतों के अनुसार to_series(), अपनी विधि का उपयोग करके एक इंडेक्स बदल सकते हैं applyया फिर map

ret = df.index.map(foo)                # Returns pd.Index
ret = df.index.to_series().map(foo)    # Returns pd.Series
ret = df.index.to_series().apply(foo)  # Returns pd.Series

उपरोक्त सभी को सीधे एक नए या मौजूदा कॉलम में सौंपा जा सकता है df:

df["column"] = ret

बस संपूर्णता के लिए: pd.Index.map, pd.Series.mapऔर pd.Series.applyसभी तत्व के लिहाज से कार्य करते हैं। मैं अक्सर उपयोग mapके प्रतिनिधित्व वाले लुकअप लागू करने के लिए dictsया pd.Seriesapplyअधिक सामान्य है क्योंकि आप अतिरिक्त argsया के साथ किसी भी फ़ंक्शन को पारित कर सकते हैं kwargsइस SO थ्रेड में अंतर applyऔर mapआगे की चर्चा की गई है । मुझे नहीं पता कि क्यों छोड़ा गया था।pd.Index.apply

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.