पंडों का उपयोग करके एक स्ट्रिंग कॉलम में प्रत्येक मान के लिए एक स्ट्रिंग उपसर्ग जोड़ें


119

मैं पंडों के डेटाफ्रेम (सुरुचिपूर्ण ढंग से) के उक्त कॉलम में प्रत्येक मूल्य की शुरुआत के लिए एक स्ट्रिंग जोड़ना चाहूंगा। मैंने पहले ही पता लगा लिया कि यह कैसे करना है और मैं वर्तमान में उपयोग कर रहा हूं:

df.ix[(df['col'] != False), 'col'] = 'str'+df[(df['col'] != False), 'col']

ऐसा लगता है कि एक अयोग्य चीज़ का एक नरक है - क्या आप किसी अन्य तरीके से जानते हैं (जो शायद उन पंक्तियों को भी जोड़ता है जहां वह स्तंभ 0 या NaN है)?

यदि यह अभी तक अस्पष्ट है, तो मैं मोड़ना चाहूंगा:

    col 
1     a
2     0

में:

       col 
1     stra
2     str0

आप वास्तव में क्या पूछ रहे हैं? कृपया यह बताएं कि आपका कोड क्या करता है / करना चाहते हैं, इस पर स्पष्टीकरण लिखें
रयान सक्से

1
मैंने सोचा कि उदाहरण कोड क्या करता है औसत पांडा उपयोगकर्ता के लिए बहुत स्पष्ट था। मैंने आपकी सुविधा के लिए उपयोग के उदाहरण जोड़े हैं।
TheChymera

3
आपका विवरण आपके कोड के साथ कुछ हद तक है। != Falseव्यापार के साथ क्या हो रहा है ? क्या आप strहर मूल्य या केवल कुछ को जोड़ना चाहते हैं ?
ब्रेनबार

हर उदाहरण के लिए, जैसा कि मेरे उदाहरण डेटाफ्रेम में दिखाया गया है।
TheChymera

1
आपका उदाहरण अभी भी स्पष्ट नहीं है, क्या आपका कुछ पसंद है df['col'] = 'str' + df['col'].astype(str)?
रोमन पाकर

जवाबों:


223
df['col'] = 'str' + df['col'].astype(str)

उदाहरण:

>>> df = pd.DataFrame({'col':['a',0]})
>>> df
  col
0   a
1   0
>>> df['col'] = 'str' + df['col'].astype(str)
>>> df
    col
0  stra
1  str0

1
धन्यवाद। यदि रुचि है, तो डेटाफ्रेम इंडेक्स भी इस तरह के स्ट्रिंग जोड़तोड़ का समर्थन करते हैं।
टैगो

2
यदि मैं संघनन से पहले शर्तों को पूरा किया जाना चाहिए तो मैं यह कैसे करूँ?
इस्काना

1
@tagoma, 4 साल के बाद, हाँ: यह डेटाफ्रेम इंडेक्स का भी समर्थन करता है। आप एक नया कॉलम बना सकते हैं और इंडेक्स वैल्यू में जोड़ सकते हैं जैसे: df ['col'] = 'str' + df.index.astype (str)
MEdwin

यदि आप अंत में किसी फ़ाइल को सहेजने का प्रयास कर रहे हैं तो "astype (str)" एन्कोडिंग को बर्बाद कर सकता है।
राईन हाशमी

2
जब मैं इसे और साथ ही किसी अन्य दृष्टिकोण से कोशिश करता हूं तो मुझे SettingWithCopyWarning मिलता है। क्या इससे बचने का कोई तरीका है?
मदन इवान

13

एक विकल्प के रूप में, आप एक applyसंयुक्त format(या f- स्ट्रिंग्स के साथ बेहतर) का उपयोग कर सकते हैं जो मुझे थोड़ा अधिक पठनीय लगता है अगर कोई भी उदाहरण प्रत्यय जोड़ना चाहता है या स्वयं तत्व को हेरफेर करना चाहता है:

df = pd.DataFrame({'col':['a', 0]})

df['col'] = df['col'].apply(lambda x: "{}{}".format('str', x))

जो वांछित उत्पादन भी देता है:

    col
0  stra
1  str0

यदि आप पाइथन 3.6+ का उपयोग कर रहे हैं, तो आप एफ-स्ट्रिंग्स का भी उपयोग कर सकते हैं:

df['col'] = df['col'].apply(lambda x: f"str{x}")

एक ही उत्पादन उपज।

F-string संस्करण लगभग उतना ही तेज़ है जितना @ RomanPekar का समाधान (अजगर 3.6.4)।

df = pd.DataFrame({'col':['a', 0]*200000})

%timeit df['col'].apply(lambda x: f"str{x}")
117 ms ± 451 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

%timeit 'str' + df['col'].astype(str)
112 ms ± 1.04 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

formatहालांकि, उपयोग करना वास्तव में बहुत धीमा है:

%timeit df['col'].apply(lambda x: "{}{}".format('str', x))
185 ms ± 1.07 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

एक ही परिणाम है, लेकिन जिस तरह से धीमी ;-)
Philipp_Kats

1
@Philipp_Kats: मैंने कुछ समय जोड़ा, सुझाव के लिए धन्यवाद! ऐसा लगता है कि एफ-स्ट्रिंग्स लगभग उतनी ही तेज हैं; formatवास्तव में बुरा प्रदर्शन करता है। आपने तुलना कैसे की?
क्लेब सिप

ओह अच्छा! मेरी समझ .applyमें "प्रत्यक्ष" सदिश संचालनों की तुलना में हमेशा या तो तेज या धीमा होता है; भले ही वे धीमे न हों, मैं जहां संभव हो, उनसे बचना पसंद करता हूं।
फिलिप_केट्स

@Philipp_Kats: मैं सहमत हूं, हालाँकि, इस विशेष मामले में मुझे यह अधिक पठनीय लगता है जब मैं एक प्रत्यय भी जोड़ता हूं, अपने आप से कुछ करता हूं x, आदि, लेकिन यह सिर्फ स्वाद की बात है ... :)
क्लेब

4

आप pandas.Series.map का उपयोग कर सकते हैं:

df['col'].map('str{}'.format)

यह आपके सभी मूल्यों से पहले "स्ट्र" शब्द लागू करेगा।


3

यदि आप टेबल फ़ाइल को लोड करते हैं dtype=str
या स्तंभ प्रकार को स्ट्रिंग में बदलते हैं df['a'] = df['a'].astype(str)
तो आप इस तरह के दृष्टिकोण का उपयोग कर सकते हैं:

df['a']= 'col' + df['a'].str[:]

यह दृष्टिकोण प्रीपेन्ड, एपेंड और सबसेट स्ट्रिंग की अनुमति देता है df
पंडों v0.23.4, v0.24.1 पर काम करता है। पहले के संस्करणों के बारे में नहीं जानते।


0

.Loc के साथ एक और समाधान:

df = pd.DataFrame({'col': ['a', 0]})
df.loc[df.index, 'col'] = 'string' + df['col'].astype(str)

यह ऊपर दिए गए समाधानों की तरह त्वरित नहीं है (> 1ms प्रति लूप धीमा) लेकिन सशर्त परिवर्तन की आवश्यकता होने पर उपयोगी हो सकता है, जैसे:

mask = (df['col'] == 0)
df.loc[mask, 'col'] = 'string' + df['col'].astype(str)

क्यों .indexमें df[mask].index?
एएमसी

@AMC क्योंकि .loc के लिए आपको डेटाफ्रेम के सूचकांकों की आवश्यकता होती है। इसका अर्थ है - df [मास्क] डेटाफ़्रेम को शर्त से मेल खाता है और df [मास्क] ।index डेटाफ़्रेम के सूचकांकों को लौटाता है। लेकिन यह सच है कि आप df.loc [(df ['col'] == 'a'), 'col'] या df.loc [मास्क, 'col'] के साथ भी ऐसा कर सकते हैं।
लुकास

1
क्योंकि .loc के लिए आपको डेटाफ़्रेम के सूचकांकों की आवश्यकता होती है। अगर df.loc[mask]काम करता है, और यह करता है, तो क्या यह .indexसही नहीं है?
एएमसी

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