किसी डेटाफ़्रेम के सभी स्ट्रिंग्स को स्ट्रिप / ट्रिम करें


80

अजगर / पंडों में एक मल्टीटैप डेटा फ्रेम के मूल्यों को साफ करते हुए, मैं स्ट्रिंग्स को ट्रिम करना चाहता हूं। मैं वर्तमान में इसे दो निर्देशों में कर रहा हूं:

import pandas as pd

df = pd.DataFrame([['  a  ', 10], ['  c  ', 5]])

df.replace('^\s+', '', regex=True, inplace=True) #front
df.replace('\s+$', '', regex=True, inplace=True) #end

df.values

यह काफी धीमा है, मैं क्या सुधार कर सकता हूं?


1
df.replace(r'\s*(.*?)\s*', r'\1', regex=True)
मैक्स 11

1
यह सबसे अच्छा जवाब है, बस @MaxU द्वारा जवाब को वोट करने के लिए लॉग-इन करें
Linkon

जवाबों:


152

आप स्तंभों DataFrame.select_dtypesका चयन करने stringऔर फिर applyकार्य करने के लिए उपयोग कर सकते हैं str.strip

सूचना: मान या typesजैसे नहीं हो सकते , क्योंकि उनका है ।dictslistsdtypesobject

df_obj = df.select_dtypes(['object'])
print (df_obj)
0    a  
1    c  

df[df_obj.columns] = df_obj.apply(lambda x: x.str.strip())
print (df)

   0   1
0  a  10
1  c   5

लेकिन अगर कुछ ही कॉलम उपयोग होते हैं str.strip:

df[0] = df[0].str.strip()

1
और SettingWithCopyWarning को इस मामले में अनदेखा किया जाना चाहिए जैसा कि समझाया गया है stackoverflow.com/questions/20625582/…
हार्वे

71

पैसे की धारीदार

यहाँ एक स्ट्रेंथ प्रकार का applymapलैम्बडा एक्सप्रेशन के साथ उपयोग करने का एक संक्षिप्त संस्करण है, stripजब मूल्य एक स्ट्रिंग प्रकार का होता है:

df.applymap(lambda x: x.strip() if isinstance(x, str) else x)

पूर्ण उदाहरण

एक और पूर्ण उदाहरण:

import pandas as pd


def trim_all_columns(df):
    """
    Trim whitespace from ends of each value across all series in dataframe
    """
    trim_strings = lambda x: x.strip() if isinstance(x, str) else x
    return df.applymap(trim_strings)


# simple example of trimming whitespace from data elements
df = pd.DataFrame([['  a  ', 10], ['  c  ', 5]])
df = trim_all_columns(df)
print(df)


>>>
   0   1
0  a  10
1  c   5

काम करने का उदाहरण

ट्रिंकेट द्वारा होस्ट किया गया एक कार्य उदाहरण यहां दिया गया है: https://trinket.io/python3/e6ab7fb4ab


1
हाय @DaleKube ... मैंने अभी-अभी एक नई मशीन पर एक संन्यासी जाँच के रूप में नए सिरे से कोशिश की और मुझे उत्तर में पोस्ट किए गए परिणाम समान मिलते हैं। क्या आप पुष्टि कर सकते हैं कि आप Python2 या Python3 का उपयोग कर रहे हैं? मैं इन दिनों केवल Python3 का उपयोग कर रहा हूं, लेकिन शायद यह एक कारक हो सकता है। यदि हां, तो मैं नोट करूंगा कि मेरे पोस्ट किए गए उत्तर में यदि आप पुष्टि करने में सक्षम हैं। धन्यवाद!
जोनाथन बी।

1
मैंने अपनी टिप्पणी हटा दी। मुझे अपने कोड में एक बग मिला, और मैं पुष्टि कर सकता हूं कि यह अब एक आकर्षण की तरह काम करता है। FYI करें, मैं पायथन 3 का उपयोग कर रहा हूं। परेशानी के लिए क्षमा करें।
डेल क्यूब

आप का उपयोग करना चाहिए type(x) == str, नहींtype(x) is str
fjsj

@fjsj कुहनी मारने के लिए धन्यवाद। मैंने PEP8 मार्गदर्शन का उपयोग करके उदाहरण को अपडेट किया है isinstance(x, str)
जोनाथन बी।

10

तुम कोशिश कर सकते हो:

df[0] = df[0].str.strip()

या विशेष रूप से सभी स्ट्रिंग कॉलम के लिए

non_numeric_columns = list(set(df.columns)-set(df._get_numeric_data().columns))
df[non_numeric_columns] = df[non_numeric_columns].apply(lambda x : str(x).strip())

9

यदि आप वास्तव में रेगेक्स का उपयोग करना चाहते हैं, तो

>>> df.replace('(^\s+|\s+$)', '', regex=True, inplace=True)
>>> df
   0   1
0  a  10
1  c   5

लेकिन इसे इस तरह करना तेज होना चाहिए:

>>> df[0] = df[0].str.strip()

5

आप ऑब्जेक्ट के applyफ़ंक्शन का उपयोग कर सकते हैं Series:

>>> df = pd.DataFrame([['  a  ', 10], ['  c  ', 5]])
>>> df[0][0]
'  a  '
>>> df[0] = df[0].apply(lambda x: x.strip())
>>> df[0][0]
'a'

के उपयोग पर ध्यान दें stripऔर नहीं regexजो बहुत तेज है

एक अन्य विकल्प - डेटाफ्रेम ऑब्जेक्ट के applyफ़ंक्शन का उपयोग करें :

>>> df = pd.DataFrame([['  a  ', 10], ['  c  ', 5]])
>>> df.apply(lambda x: x.apply(lambda y: y.strip() if type(y) == type('') else y), axis=0)

   0   1
0  a  10
1  c   5

1
df[0] = df[0].str.strip()-, सबसे अधिक संभवतया, बड़े DFs पर अधिक तेज़ होगा
MaxU

-1
def trim(x):
    if x.dtype == object:
        x = x.str.split(' ').str[0]
    return(x)

df = df.apply(trim)

1
क्या आप बता सकते हैं कि फ़ंक्शन कृपया क्या कर रहा है?
सीजे डेनिस

उदाहरण के लिए, मैं अपने दैनिक कार्य में इस तरह के डेटा का सामना करता हूं: 가나다 봻 खाली भाग जो मैं चाहता हूं, सही भाग कचरा है। ट्रिम फंक्शन एक्सट्रैक्ट जो मुझे कच्चे डेटा से चाहिए।
ह्यूनव्यू जेओंग

डाउनवोट किया गया क्योंकि यह स्ट्रिंग को ट्रिम नहीं करता है, यह पहली जगह के बाद सब कुछ हटा देता है। यह प्रश्न में पूछा गया व्यवहार नहीं है, और साइड-इफेक्ट्स का परिचय देता है जो एक पाठक उम्मीद नहीं कर सकता है। इसके अलावा, दुष्प्रभाव तुरंत स्पष्ट नहीं हो सकता है। यदि आप अंतिम नामों के एक कॉलम को ट्रिम करने की कोशिश कर रहे हैं, तो आप सोच सकते हैं कि यह उद्देश्य के रूप में काम कर रहा है क्योंकि अधिकांश लोगों के पास कई अंतिम नाम नहीं हैं और अनुगामी रिक्त स्थान हां निकाल दिए जाते हैं। तब दो अंतिम नामों वाला एक पुर्तगाली व्यक्ति आपकी साइट से जुड़ जाता है और कोड उनके अंतिम अंतिम नाम को हटा देता है, केवल उनका पहला अंतिम नाम छोड़ देता है।
स्काउटक्लोवे 20
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.