2016-12-13 16 views
5

के सभी कक्ष मान से उपसर्ग/प्रत्यय निकालने के लिए, मैं आमतौर पर निम्नलिखित है ..पांडा dataframe: जोड़ने और एक dataframe करने के लिए एक उपसर्ग/प्रत्यय जोड़ने के लिए पूरे dataframe

उदाहरण के लिए, एक प्रत्यय '@',

जोड़ने के लिए
df = df.astype(str) + '@' 

यह मूल रूप से '@' को सभी सेल मानों में जोड़ दिया गया है।

मैं जानना चाहता हूं कि इस प्रत्यय को कैसे हटाया जाए। क्या पांडा के साथ कोई विधि उपलब्ध है। डेटाफ्रेम क्लास सीधे डेटाफ्रेम से एक विशेष उपसर्ग/प्रत्यय चरित्र को हटा देती है?

for index in range(df.shape[0]): 
    row = df.iloc[index] 
    row = row.str.rstrip('@') 

अब, आदेश में इस श्रृंखला से बाहर dataframe बनाने के लिए,

new_df = pd.DataFrame(columns=list(df)) 
new_df = new_df.append(row) 

हालांकि,:

मैं जबकि rstrip('@') का उपयोग कर के रूप में इस पंक्तियों के माध्यम से पुनरावृत्ति की कोशिश की है (श्रृंखला के रूप में) यह काम नहीं करता है। खाली डेटा फ्रेम देता है।

क्या कुछ सचमुच बुनियादी है जो मुझे याद आ रही है?

उत्तर

3

आप प्रत्येक तत्व के लिए अपने स्ट्रिंग विधि लागू करने के लिए applymap इस्तेमाल कर सकते हैं:

df = df.applymap(lambda x: str(x).rstrip('@')) 
+0

सही! धन्यवाद एलेक्स :) – murphy1310

5

आप apply उपयोग कर सकते हैं और pd.Series की str.strip विधि:

In [13]: df 
Out[13]: 
     a  b  c 
0 dog quick the 
1 lazy lazy fox 
2 brown quick dog 
3 quick  the over 
4 brown over lazy 
5 fox brown quick 
6 quick  fox the 
7 dog jumped the 
8 lazy brown the 
9 dog lazy the 

In [14]: df = df + "@" 

In [15]: df 
Out[15]: 
     a  b  c 
0 [email protected] [email protected] [email protected] 
1 [email protected] [email protected] [email protected] 
2 [email protected] [email protected] [email protected] 
3 [email protected]  [email protected] [email protected] 
4 [email protected] [email protected] [email protected] 
5 [email protected] [email protected] [email protected] 
6 [email protected]  [email protected] [email protected] 
7 [email protected] [email protected] [email protected] 
8 [email protected] [email protected] [email protected] 
9 [email protected] [email protected] [email protected] 

In [16]: df = df.apply(lambda S:S.str.strip('@')) 

In [17]: df 
Out[17]: 
     a  b  c 
0 dog quick the 
1 lazy lazy fox 
2 brown quick dog 
3 quick  the over 
4 brown over lazy 
5 fox brown quick 
6 quick  fox the 
7 dog jumped the 
8 lazy brown the 
9 dog lazy the 

ध्यान दें, अपने दृष्टिकोण काम नहीं करता है, क्योंकि जब आप में निम्न असाइनमेंट अपने लिए लूप:

row = row.str.rstrip('@') 

यह को बिना किसी संदेश के row नाम पर row.str.strip का परिणाम केवल निर्दिष्ट करता है।

In [18]: rows = [[1,2,3],[4,5,6],[7,8,9]] 

In [19]: print(rows) 
[[1, 2, 3], [4, 5, 6], [7, 8, 9]] 

In [20]: for row in rows: 
    ...:  row = ['look','at','me'] 
    ...: 

In [21]: print(rows) 
[[1, 2, 3], [4, 5, 6], [7, 8, 9]] 

वास्तव में अंतर्निहित डेटा संरचना आप एक mutator विधि का उपयोग करने की जरूरत है बदलने के लिए::

In [22]: rows 
Out[22]: [[1, 2, 3], [4, 5, 6], [7, 8, 9]] 

In [23]: for row in rows: 
    ...:  row.append("LOOKATME") 
    ...: 

In [24]: rows 
Out[24]: [[1, 2, 3, 'LOOKATME'], [4, 5, 6, 'LOOKATME'], [7, 8, 9, 'LOOKATME']] 

ध्यान दें कि टुकड़ा-असाइनमेंट बस है यह सब अजगर वस्तुओं और सरल नाम काम के लिए एक ही व्यवहार है एक mutator विधि के लिए वाक्यात्मक चीनी:

In [26]: rows 
Out[26]: [[1, 2, 3], [4, 5, 6], [7, 8, 9]] 

In [27]: for row in rows: 
    ...:  row[:] = ['look','at','me'] 
    ...: 
    ...: 

In [28]: rows 
Out[28]: [['look', 'at', 'me'], ['look', 'at', 'me'], ['look', 'at', 'me']] 

यह pandasloc या iloc आधारित अस्सी के अनुरूप है gnment।

+0

धन्यवाद Juanpa। df.apply (...) में मदद करता है हालांकि, मेरा आउटपुट new_df के माध्यम से है और डीएफ नहीं है। मुझे इसके साथ और अधिक सटीक होना चाहिए था। वैसे भी धन्यवाद :) – murphy1310

+0

हू? क्या यह आपकी समस्या का समाधान नहीं करता है। मैं अपने डेटा फ्रेम डीएफ कहा जाता है। यदि आप –

+0

ओह नहीं चाहते हैं तो आप परिणाम को new_df में जोड़ सकते हैं। मेरा मतलब यह नहीं था कि :) df.apply() समस्या को हल करता है .. धन्यवाद! मेरा मतलब था कि मेरी समस्या अंतर्निहित डेटा को म्यूट करने के साथ नहीं थी। शायद मैं बहुत स्पष्ट नहीं था। – murphy1310

संबंधित मुद्दे