পান্ডা ব্যবহার করে স্ট্রিং কলামে প্রতিটি মানটিতে একটি স্ট্রিং উপসর্গ যুক্ত করুন


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
আমি ভেবেছিলাম উদাহরণ কোডটি যা করে তা গড় পান্ডাস ব্যবহারকারীর কাছে খুব স্পষ্ট। আমি আপনার সুবিধার্থে ব্যবহারের ক্ষেত্রে উদাহরণ যুক্ত করেছি।
থিমের

3
আপনার বিবরণটি আপনার কোডের সাথে কিছুটা মতবিরোধে রয়েছে। != Falseব্যবসা নিয়ে কী হচ্ছে ? আপনি কি strপ্রতিটি মান বা কিছু যোগ করতে চান ?
ব্রেণবার্ন

প্রতিটি মান হিসাবে, যেমন আমার উদাহরণ ডেটা ফ্রেমগুলিতে দেখানো হয়েছে।
থেমেমেরা

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
@ টাগোমা, 4 বছর পরে, হ্যাঁ: এটি ডেটাফ্রেম সূচকে সমর্থন করে। আপনি একটি নতুন কলাম তৈরি করতে পারেন এবং সূচকের মানটিতে যেমন যুক্ত করতে পারেন: df ['col'] = 'str' + df.index.astype (str)
এমডউইন

"অ্যাস্টাইপ (স্ট্র)" এনকোডিংটি নষ্ট করে দিতে পারে যদি আপনি শেষ পর্যন্ত কোনও ফাইলে সংরক্ষণ করার চেষ্টা করছেন।
রাহীন হাশেমি

2
যখন আমি এটির পাশাপাশি অন্য যে কোনও পদ্ধতির চেষ্টা করি তখন আমি একটি সেটিং উইথকপি ওয়ার্নিং পাই। এড়াতে কি উপায় আছে?
মদন ইভান

13

বিকল্প হিসাবে, আপনি একটি applyসংযুক্ত format(বা এফ-স্ট্রিংগুলির সাথে আরও ভাল) ব্যবহার করতে পারেন যা আমি কিছুটা আরও পঠনযোগ্য দেখতে পাই যদি একটি উদাহরণও একটি প্রত্যয় যুক্ত করতে চায় বা উপাদানটি নিজেই চালিত করতে চায়:

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}")

একই আউটপুট ফলন।

এফ-স্ট্রিং সংস্করণটি @ রোমানপেকারের সলিউশন (পাইথন ৩.6.৪) এর মতো প্রায় দ্রুত:

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)

একই ফলস্বরূপ, তবে উপায় ধীর ;-)
ফিলিপ_ক্যাটস

1
@ ফিলিপ_ক্যাটস: আমি কিছু সময় যুক্ত করেছি, পরামর্শের জন্য ধন্যবাদ! দেখে মনে হচ্ছে এফ-স্ট্রিংগুলি প্রায় তত দ্রুত; formatপ্রকৃতপক্ষে আরও খারাপ কাজ করে। আপনি কীভাবে তুলনা করেছেন?
ক্লাব

ওহ্হ দারুন! আমার বোঝার .applyমধ্যে সর্বদা হয় "সরাসরি" ভেক্টরাইজড অপারেশনগুলির চেয়ে দ্রুত বা ধীর; এমনকি যদি তারা ধীর না হয় তবে আমি যেখানে সম্ভব সেখানে এড়াতে পছন্দ করি।
ফিলিপ_ক্যাটস

@ ফিলিপ_ক্যাটস: আমি একমত হই, তবে এই বিশেষ ক্ষেত্রে আমি যখন আরও প্রত্যয় যুক্ত করি, xনিজের সাথে কিছু করি ইত্যাদিও আমি এটিকে আরও পাঠযোগ্য বলে মনে করি , তবে এটি কেবল স্বাদের বিষয় ... :)
ক্লিপ

4

আপনি পান্ডাস.সরিস.ম্যাপ ব্যবহার করতে পারেন:

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

এটি আপনার সমস্ত মানের আগে "str" ​​শব্দটি প্রয়োগ করবে।


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)

এটি উপরের সমাধানগুলির তুলনায় তত দ্রুত নয় (> লুপ প্রতি ধীরে ধীরে 1 মিমি) তবে শর্তযুক্ত পরিবর্তনের প্রয়োজন হলে এটি কার্যকর হতে পারে:

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

কেন .indexdf[mask].index?
এএমসি

@ এএমসি কারণ আপনার কাছে ডেটাফ্রেমের সূচকের প্রয়োজন। এর অর্থ হল - ডিএফ [মাস্ক] শর্তের সাথে মিলে ডেটাফ্রেম প্রদান করে এবং ডিএফ [মাস্ক]। সূচক ডাটাফ্রেমের সূচকগুলি প্রদান করে। তবে এটি সত্য যে আপনি df.loc [(df ['কোল'] == 'a'), 'কল'] বা df.loc [মুখোশ, 'কল'] দিয়েও একই কাজ করতে পারেন।
লুকাস

1
কারণ .loc জন্য আপনার ডেটাফ্রেমের সূচকগুলি দরকার। যদি df.loc[mask]কাজ করে, এবং এটি করে, তবে এটি .indexঅতিমাত্রায়, তাই না?
এএমসি

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