যদি কোনও পান্ডাস ডেটা ফ্রেম স্ট্রিং কলামটির মূল্য হারিয়ে যায় তবে কিভাবে এটি ছোট করা যায়?


87

নিম্নলিখিত কোডটি কাজ করে না।

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 = ['এক', 'দুই', এনপি.নান] পাওয়ার জন্য আমি কীভাবে এটি টুইট করব? বাস্তব ডেটা ফ্রেম বিশাল যেহেতু দক্ষতা গুরুত্বপূর্ণ।


V0.25 থেকে, আমি str.casefoldআরও আক্রমণাত্মক কেস ফোল্ডিং স্ট্রিং তুলনা করার জন্য প্রস্তাব দিই । এই উত্তর আরও তথ্য ।
cs95

উত্তর:


189

পান্ডাস ভেক্টরাইজড স্ট্রিং পদ্ধতিগুলি ব্যবহার করুন ; নথি হিসাবে:

এই পদ্ধতিগুলি অনুপস্থিত / এনএ মানগুলি স্বয়ংক্রিয়ভাবে বাদ দেয়

.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
এডচাম

4
@ এডচাম যা কেবল 3 টি উপাদান দিয়ে অবাক হয় না; তবে এটি কেবল 100 টি উপাদান বলার ক্ষেত্রে হবে না;
behzad.nouri

@ বেহজাদ.নৌরি আমি ডিএফ 1 চেষ্টা করেছি ['মন্তব্য'] = ডিএফ 1 ['মন্তব্য']। স্ট্রোয়ার ব্লুয়ার () তবে ত্রুটি পেয়েছে কী-এরর: 'মন্তব্য' প্রতিটি বিষয়। আমি চেক করেছিলাম - আমার কাছে কলামের নাম বর্ণমুখে একই রয়েছে। কোন ত্রুটির কারণ হতে পারে?
কাটিয়া

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

সম্পাদনা করুন:

আপনি যদি এনএএনগুলি হারাতে না চান, তবে মানচিত্রটি ব্যবহার করা আরও ভাল হবে (@ ওউজসিচ-ওয়ালকাজাক এবং @ সিএস 95 মন্তব্য থেকে) এটি এর মতো দেখতে পাবেন will

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

4
ধন্যবাদ মানুষ! আমি NaNs সম্পর্কে ভুলে গিয়েছিলাম, আমি কেবল উত্তরটি সংশোধন করেছি
মাইক ডব্লিউ

7

আপনি এটি চেষ্টা করতে পারেন,

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

4
type(s) == strপরিবর্তে হওয়া উচিতisinstance(s, str)
cs95

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

পান্ডস> = 0.25: এর সাথে কেস পার্থক্য সরান str.casefold

V0.25 থেকে শুরু করে, আমি str.casefoldযদি আপনি ইউনিকোড ডেটা নিয়ে কাজ করে থাকেন তবে "ভেক্টরাইজড" স্ট্রিং পদ্ধতিটি ব্যবহার করার পরামর্শ দিচ্ছি (স্ট্রিং বা ইউনিকোড নির্বিশেষে এটি কাজ করে):

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

0       lower
1    capitals
2         NaN
3    swapcase
dtype: object

এছাড়াও সম্পর্কিত গিটহাব ইস্যু GH25405 দেখুন

casefoldনিজেকে আরও আক্রমণাত্মক কেস-ভাঁজ করার তুলনায় ধার দেয়। এটি NaN গুলি কৌতূহলীভাবে পরিচালনা করে (ঠিক যেমনstr.lower করে)।

তবে কেন এই ভাল?

পার্থক্যটি ইউনিকোডের সাথে দেখা হয়। অজগর str.casefoldডক্সে উদাহরণ গ্রহণ করা ,

কেসফোল্ডিং হ্রাস করা একইরকম তবে আরও আক্রমণাত্মক কারণ এটি স্ট্রিংয়ের ক্ষেত্রে সমস্ত ক্ষেত্রে পার্থক্যগুলি সরিয়ে ফেলার উদ্দেশ্যে is উদাহরণস্বরূপ, জার্মান ছোট হাতের অক্ষর 'ß'সমান "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

আরো দেখুন পাইথন: LOWER () বনাম casefold () স্ট্রিং ম্যাচিং এবং ছোট হাতের অক্ষরে রূপান্তর


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)


1

প্রয়োগ ফাংশন ব্যবহার করুন,

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

4
দক্ষতা যেমন ব্যবহারকারীর পক্ষে গুরুত্বপূর্ণ (Efficiency is important since the real data frame is huge.)এবং আরও কয়েকটি উত্তর রয়েছে, দয়া করে আপনার উত্তরের উত্তম বিন্দুটি কোনটি প্রকাশ করার চেষ্টা করুন।
ডেভিড গার্সিয়া বোদেগো

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.