প্যান্ডাস এক কলামে মানের শর্তের ভিত্তিতে একাধিক কলামে মানগুলি ওভাররাইট করে


11

আমার কাছে এই জাতীয় ডেটা ফ্রেম রয়েছে:

df = pd.DataFrame(data={
    'col0': [11, 22,1, 5]
    'col1': ['aa:a:aaa', 'a:a', 'a', 'a:aa:a:aaa'],
    'col2': ["foo", "foo", "foobar", "bar"],
    'col3': [True, False, True, False],
    'col4': ['elo', 'foo', 'bar', 'dupa']})

আমি কল 1 এ ":" বিভক্ত হওয়ার পরে তালিকার দৈর্ঘ্য পেতে চাই, তারপরে আমি দৈর্ঘ্য> 2 লিখতে লিখতে মানগুলিকে ওভাররাইট করতে চাই অথবা 2 = দৈর্ঘ্য হলে মানগুলি ওভাররাইট না করে চাই।

আদর্শভাবে, যত তাড়াতাড়ি সম্ভব এক লাইনে।

বর্তমানে, আমি চেষ্টা করি তবে এটি মান ভঙ্গ করে।

df[['col1', 'col2', 'col3']] = df.loc[df['col1'].str.split(":").apply(len) > 2], ("", "", False), df[['col1', 'col2', 'col3']])

সম্পাদনা: কল 1 এ শর্ত সম্পাদনা 2: দুর্দান্ত এবং দ্রুত সরবরাহ করা সমস্ত উত্তরের জন্য আপনাকে ধন্যবাদ। আশ্চর্যজনক! EDIT3: 10 ^ 6 টি সারি সময়:

@ এনসেভ 3.2657 এস

@ জেজরেল 0.8922 এস

@ anky_91 1.9511s


শর্তটি col2নাকি চলছে col1?
anishtain4

আমি ভুলের জন্য ক্ষমা চাই। এটি কল 1
dkrynicki

উত্তর:


8

তালিকাতে ফিল্টারকৃত কলামগুলিতে তালিকাটি ব্যবহার করুন Series.str.count, যুক্ত করুন 1, তুলনা করুন Series.gtএবং নির্ধারণ করুন:

df.loc[df['col1'].str.count(":").add(1).gt(2), ['col1','col2','col3']] = ["", "", False]
print (df)
   col0 col1    col2   col3  col4
0    11               False   elo
1    22  a:a     foo  False   foo
2     1    a  foobar   True   bar
3     5               False  dupa

2
এটি সেরা উত্তর কারণ এটি কোনও অস্থায়ী বিভাজন সংরক্ষণ করে না, তবে কেন gt(1)1 এবং যোগ করার পরিবর্তে ব্যবহার করছে না gt(2)?
anishtain4

@ anishtain4 - হ্যাঁ, সম্মতি
jezrael

10

series.str.len()তালিকার দৈর্ঘ্য নির্ধারণ করতে আপনাকে বিভাজনের পরে প্রয়োজন , তারপরে আপনি .loc[]শর্তটি মেলে যেখানেই তালিকাটি তুলনা এবং ব্যবহার করতে পারেন, তালিকা নির্ধারণ করতে পারেন :

df.loc[df['col1'].str.split(":").str.len()>2,['col1','col2','col3']]=["", "", False]
print(df)

   col0 col1    col2   col3  col4
0    11               False   elo
1    22  a:a     foo  False   foo
2     1    a  foobar   True   bar
3     5               False  dupa

5

আরেকটি পদ্ধতির Series.str.splitসাথে expand = Trueএবং DataFrame.countসাথে হয় axis=1

df.loc[df['col1'].str.split(":",expand = True).count(axis=1).gt(2),['col1','col2','col3']]=["", "", False]
print(df)
   col0 col1    col2   col3  col4
0    11               False   elo
1    22  a:a     foo  False   foo
2     1    a  foobar   True   bar
3     5               False  dupa
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.