अगर यह लापता मान है तो एक पांडा डेटाफ्रेम स्ट्रिंग कॉलम को कैसे कम किया जाए?


85

निम्नलिखित कोड काम नहीं करता है।

import pandas as pd
import numpy as np
df=pd.DataFrame(['ONE','Two', np.nan],columns=['x']) 
xLower = df["x"].map(lambda x: x.lower())

XLower = ['one', 'two', np.nan] पाने के लिए मुझे इसे कैसे ट्वीक करना चाहिए? दक्षता महत्वपूर्ण है क्योंकि वास्तविक डेटा फ़्रेम विशाल है।


V0.25 के बाद से, मैं str.casefoldऔर अधिक आक्रामक मामले तह स्ट्रिंग तुलना के लिए सलाह देता हूं । इस उत्तर में अधिक जानकारी ।
cs95

जवाबों:


182

पांडा सदिश स्ट्रिंग विधियों का उपयोग करें ; प्रलेखन के रूप में:

ये विधियाँ स्वतः ही अनुपलब्ध / NA मानों को बाहर कर देती हैं

.str.lower() वहाँ बहुत पहला उदाहरण है;

>>> df['x'].str.lower()
0    one
1    two
2    NaN
Name: x, dtype: object

दिलचस्प रूप से यह अन्य उत्तर 10000 loops, best of 3: 96.4 µs per loopबनाम10000 loops, best of 3: 125 µs per loop
एडचम

1
@EdChum जो केवल 3 तत्वों से आश्चर्यचकित नहीं है; लेकिन सिर्फ 100 तत्वों के साथ ऐसा नहीं होगा;
बेहज़ाद.नौरी

@ behzad.nouri मैंने df1 ['टिप्पणी'] = df1 ['टिप्पणी'] की कोशिश की। str.lower () लेकिन त्रुटि मिली KeyRrror: 'टिप्पणी' हर बार। मैंने जाँच की - मेरे पास स्तम्भन का नाम है जो एक ही है। क्या त्रुटि हो सकती है?
कात्या

16

एक अन्य संभावित समाधान, यदि स्तंभ में न केवल तार हैं, बल्कि संख्याएँ भी हैं, क्योंकि इसका उपयोग करना है astype(str).str.lower()या to_string(na_rep='')क्योंकि अन्यथा, यह देखते हुए कि कोई संख्या एक स्ट्रिंग नहीं है, जब इसे कम किया जाएगा NaN, इसलिए:

import pandas as pd
import numpy as np
df=pd.DataFrame(['ONE','Two', np.nan,2],columns=['x']) 
xSecureLower = df['x'].to_string(na_rep='').lower()
xLower = df['x'].str.lower()

तो हमारे पास हैं:

>>> xSecureLower
0    one
1    two
2   
3      2
Name: x, dtype: object

और नहीं

>>> xLower
0    one
1    two
2    NaN
3    NaN
Name: x, dtype: object

संपादित करें:

यदि आप NaN खोना नहीं चाहते हैं, तो मानचित्र का उपयोग करना बेहतर होगा, (@ wojciech-walczak, और @ cs95 टिप्पणी से) यह कुछ इस तरह दिखेगा

xSecureLower = df['x'].map(lambda x: x.lower() if isinstance(x,str) else x)

1
धन्यवाद दोस्त! मैं NaNs के बारे में भूल गया, मैंने सिर्फ जवाब को सही किया
माइक डब्ल्यू

7

एक संभावित समाधान:

import pandas as pd
import numpy as np

df=pd.DataFrame(['ONE','Two', np.nan],columns=['x']) 
xLower = df["x"].map(lambda x: x if type(x)!=str else x.lower())
print (xLower)

और एक परिणाम:

0    one
1    two
2    NaN
Name: x, dtype: object

हालांकि दक्षता के बारे में निश्चित नहीं है।


अन्य उत्तर के समान, isinstanceकिसी वस्तु के प्रकार की जाँच करते समय उपयोग करें ।
CS95

6

आप इसे भी आजमा सकते हैं,

df= df.applymap(lambda s:s.lower() if type(s) == str else s)

1
type(s) == strइसके बजाय होना चाहिएisinstance(s, str)
cs95

6

पंडों> = 0.25: केस डिस्टिक्शंस को निकालें str.casefold

str.casefoldयदि आप यूनिकोड डेटा के साथ काम कर रहे हैं (यह स्ट्रिंग या यूनिकोड की परवाह किए बिना काम करता है): v0.25 से शुरू, मैं "सदिश" स्ट्रिंग विधि का उपयोग करने की सलाह देता हूं :

s = pd.Series(['lower', 'CAPITALS', np.nan, 'SwApCaSe'])
s.str.casefold()

0       lower
1    capitals
2         NaN
3    swapcase
dtype: object

संबंधित GitHub मुद्दा GH25405 भी देखें ।

casefoldअधिक आक्रामक केस-फोल्डिंग तुलना के लिए खुद को उधार देता है। यह NaNs को इनायत से (जैसे str.lowerकरता है) संभालता है ।

लेकिन यह बेहतर क्यों है?

अंतर यूनिकोड के साथ देखा जाता है। अजगर str.casefoldडॉक्स में उदाहरण लेते हुए ,

Casefolding लोअरकेसिंग के समान है लेकिन अधिक आक्रामक है क्योंकि यह एक स्ट्रिंग में सभी मामले के अंतर को हटाने का इरादा है। उदाहरण के लिए, जर्मन लोअरकेस अक्षर 'ß'के बराबर है "ss"। चूंकि यह पहले से ही छोटा है, इसलिए lower()इससे कुछ नहीं होगा 'ß'; casefold() इसे धर्मान्तरित करता है "ss"

के उत्पादन की तुलना करें lower,

s = pd.Series(["der Fluß"])
s.str.lower()

0    der fluß
dtype: object

बनाम casefold,

s.str.casefold()

0    der fluss
dtype: object

इसके अलावा पायथन: लोअर () बनाम केसफॉल्ड () स्ट्रिंग मिलान में और लोअरकेस में कनवर्ट करें


2

सूची बोध का उपयोग कर सकते हैं

import pandas as pd
import numpy as np
df=pd.DataFrame(['ONE','Two', np.nan],columns=['Name']})
df['Name'] = [str(i).lower() for i in df['Name']] 

print(df)

2

लंबोदर समारोह लागू करें

df['original_category'] = df['original_category'].apply(lambda x:x.lower())

1

उपयोग आवेदन समारोह,

Xlower = df['x'].apply(lambda x: x.upper()).head(10) 

1
चूंकि दक्षता उपयोगकर्ता के लिए महत्वपूर्ण है (Efficiency is important since the real data frame is huge.)और कुछ और उत्तर हैं, कृपया, यह उजागर करने का प्रयास करें कि कौन सा आपके उत्तर का अच्छा बिंदु है।
डेविड गार्सिया बोडेगो

0

अपना डेटाफ़्रेम कॉलम कॉपी करें और बस आवेदन करें

df=data['x']
newdf=df.str.lower()
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.