পান্ডাস ডেটাফ্রেমে স্থির মান সহ কলাম যুক্ত করুন [সদৃশ]


104

একটি ডেটা ফ্রেম দেওয়া হয়েছে:

np.random.seed(0)
df = pd.DataFrame(np.random.randn(3, 3), columns=list('ABC'), index=[1, 2, 3])
df

          A         B         C
1  1.764052  0.400157  0.978738
2  2.240893  1.867558 -0.977278
3  0.950088 -0.151357 -0.103219

একটি ধ্রুবক মান যেমন 0 সহ নতুন কলাম যুক্ত করার সহজ উপায় কী?

          A         B         C  new
1  1.764052  0.400157  0.978738    0
2  2.240893  1.867558 -0.977278    0
3  0.950088 -0.151357 -0.103219    0

এটি আমার সমাধান, তবে আমি জানি না কেন এটি এনএএনকে 'নতুন' কলামে রাখে?

df['new'] = pd.Series([0 for x in range(len(df.index))])

          A         B         C  new
1  1.764052  0.400157  0.978738  0.0
2  2.240893  1.867558 -0.977278  0.0
3  0.950088 -0.151357 -0.103219  NaN

9
আপনি যদি একটি সূচক ব্যবহার করেন তবে তা ঠিক আছে। df['new'] = pd.Series([0 for x in range(len(df.index))], index=df.index)
জাচ

4
এছাড়াও, একটি তালিকা বোধগম্যতা এখানে সম্পূর্ণ অপ্রয়োজনীয়। শুধু করুন[0] * len(df.index)
আকুশনার

@জোরিস, আমি বোঝাতে চাইছিলাম যে ডিএফ ['নতুন'] = 0 পুরো কলামে জিরো নির্ধারণের সঠিক কারণটি দেখায়, তবে কেন এটি আমার প্রথম প্রয়াস NAN প্রবেশ করিয়ে দেয় তা ব্যাখ্যা করে না। ফিলিপ ক্লাউড এই উত্তরটি মেনে নিয়েছিল বলে আমি উত্তর দিয়েছি।
ইয়ামু

7
সহজভাবে করুনdf['new'] = 0
ফ্লো 2 কে

উত্তর:


22

কারণ এই রাখে NaNএকটি কলাম মধ্যে কারণ df.indexএবং Indexআপনার ডানদিকের সাইড বস্তুর ভিন্ন। @ জ্যাচ জিরোসের নতুন কলামটি নির্ধারণের সঠিক উপায় দেখায়। সাধারণভাবে, pandasসূচকগুলির যথাসম্ভব প্রান্তিককরণ করার চেষ্টা করে। একটি খারাপ দিক হ'ল সূচকগুলি যখন সারিবদ্ধ না হয় আপনি NaNযেখানেই সেগুলি প্রান্তিক না করা অবস্থায় পাবেন । আংশিক, সম্পূর্ণরূপে, এবং সারিবদ্ধ না-হওয়া সমস্ত প্রান্তিক সূচকগুলি এমন বস্তুর সাথে প্রান্তিককরণের জন্য কিছু স্বজ্ঞাততা অর্জনের জন্য reindexএবং alignপদ্ধতিগুলির সাথে চারপাশে খেলুন । উদাহরণস্বরূপ এখানে DataFrame.align()আংশিকভাবে প্রান্তিককরণ সূচকগুলির সাথে কীভাবে কাজ করা হয়:

In [7]: from pandas import DataFrame

In [8]: from numpy.random import randint

In [9]: df = DataFrame({'a': randint(3, size=10)})

In [10]:

In [10]: df
Out[10]:
   a
0  0
1  2
2  0
3  1
4  0
5  0
6  0
7  0
8  0
9  0

In [11]: s = df.a[:5]

In [12]: dfa, sa = df.align(s, axis=0)

In [13]: dfa
Out[13]:
   a
0  0
1  2
2  0
3  1
4  0
5  0
6  0
7  0
8  0
9  0

In [14]: sa
Out[14]:
0     0
1     2
2     0
3     1
4     0
5   NaN
6   NaN
7   NaN
8   NaN
9   NaN
Name: a, dtype: float64

11
আমি downvote হয়নি কিন্তু আপনার কোড মন্তব্য অভাব আছে, এটা তোলে হার্ড যে Youre মধ্যে স্নিপেট অর্জন করার চেষ্টা সঙ্গে বরাবর অনুসরণ করতে
প্রতিকার

8
এটি আসলে প্রশ্নের উত্তর দেয় না। ওপি একটি ধ্রুবক মানযুক্ত একটি নতুন কলাম কীভাবে যুক্ত করবেন সে সম্পর্কে জিজ্ঞাসা করছে।
সিএস 95

আমি একমত নই যে এখানে কেবল একটি প্রশ্ন আছে। সেখানে "আমি কীভাবে একটি কলামের একটি ধ্রুবক মান নির্ধারণ করব?" পাশাপাশি "আমার এটি করার চেষ্টাটি এক্স উপায়ে কাজ করে না, কেন এটি অপ্রত্যাশিতভাবে আচরণ করছে?" আমি বিশ্বাস করি যে আমি উভয় পয়েন্ট সম্বোধন করেছি, প্রথমটি অন্য উত্তর উল্লেখ করে। আমার উত্তরে সমস্ত পাঠ্য দয়া করে পড়ুন ।
ফিলিপ ক্লাউড

আমি মনে করি আপনার উত্তরটি না দিয়ে সমস্যাটি প্রশ্নটি নিয়ে। এই পোস্টে দুটি স্বতন্ত্র প্রশ্ন রয়েছে এবং ফলস্বরূপ প্রশ্নের উত্তর দেওয়ার জন্য দুটি স্বতন্ত্র উত্তর প্রয়োজন। আমি বিশ্বাস করি এটি খুব বিস্তৃত হিসাবে পতাকাঙ্কিত করা উচিত ছিল এবং পোস্টারের দুটি পৃথক প্রশ্ন জিজ্ঞাসা করা উচিত ছিল।
কেভিন

90

সুপার-ইন-প্লেস অ্যাসাইনমেন্ট: df['new'] = 0

ইন-প্লেস পরিবর্তনের জন্য, সরাসরি কার্য সম্পাদন করুন। এই অ্যাসাইনমেন্টটি প্রতিটি সারির জন্য পান্ডাস দ্বারা সম্প্রচারিত।

df = pd.DataFrame('x', index=range(4), columns=list('ABC'))
df

   A  B  C
0  x  x  x
1  x  x  x
2  x  x  x
3  x  x  x

df['new'] = 'y'
# Same as,
# df.loc[:, 'new'] = 'y'
df

   A  B  C new
0  x  x  x   y
1  x  x  x   y
2  x  x  x   y
3  x  x  x   y

অবজেক্ট কলামগুলির জন্য নোট

আপনি যদি খালি তালিকার একটি কলাম যুক্ত করতে চান তবে আমার পরামর্শটি এখানে:

  • এটি না করার বিষয়টি বিবেচনা করুন। objectপারফরম্যান্সের ক্ষেত্রে কলামগুলি খারাপ সংবাদ। আপনার ডেটা কীভাবে স্ট্রাকচার করা হয় তা পুনর্বিবেচনা করুন।
  • আপনার ডেটাগুলিকে একটি বিচ্ছিন্ন ডাটা স্ট্রাকচারে সঞ্চয় করার বিষয়ে বিবেচনা করুন। আরও তথ্য: স্পার্স ডেটা স্ট্রাকচার
  • যদি আপনাকে অবশ্যই তালিকার একটি কলাম সংরক্ষণ করতে হয় তবে একাধিকবার একই রেফারেন্সটি অনুলিপি না করে তা নিশ্চিত করুন।

    # Wrong
    df['new'] = [[]] * len(df)
    # Right
    df['new'] = [[] for _ in range(len(df))]
    

একটি অনুলিপি তৈরি করা হচ্ছে: df.assign(new=0)

পরিবর্তে আপনার যদি একটি অনুলিপি প্রয়োজন হয়, ব্যবহার করুন DataFrame.assign:

df.assign(new='y')

   A  B  C new
0  x  x  x   y
1  x  x  x   y
2  x  x  x   y
3  x  x  x   y

এবং, যদি আপনাকে একই মান সহ একাধিক কলামগুলি বরাদ্দ করতে হয় তবে এটি এতটা সহজ,

c = ['new1', 'new2', ...]
df.assign(**dict.fromkeys(c, 'y'))

   A  B  C new1 new2
0  x  x  x    y    y
1  x  x  x    y    y
2  x  x  x    y    y
3  x  x  x    y    y

একাধিক কলাম অ্যাসাইনমেন্ট

শেষ অবধি, যদি আপনাকে বিভিন্ন মান সহ একাধিক কলামগুলি বরাদ্দ করতে হয় তবে আপনি assignঅভিধানের সাহায্যে ব্যবহার করতে পারেন ।

c = {'new1': 'w', 'new2': 'y', 'new3': 'z'}
df.assign(**c)

   A  B  C new1 new2 new3
0  x  x  x    w    y    z
1  x  x  x    w    y    z
2  x  x  x    w    y    z
3  x  x  x    w    y    z

21

আধুনিক পান্ডার সাহায্যে আপনি কেবল এটি করতে পারেন:

df['new'] = 0

4
আপনি নির্দিষ্ট কোন উত্তরগুলি তারিখের বাইরে বলতে পারেন? আসুন তাদের অধীনে একটি মন্তব্য দিন যাতে লেখকদের উন্নতি করার সুযোগ থাকে।
cs95

4
Fyi এই উত্তর এবং cs95 (একে, আমি) উত্তরের মধ্যে একমাত্র পার্থক্য হ'ল কলামের নাম এবং মান। সব টুকরো আছে।
সিএস 95

4
এগুলি এত বেশি নয় যে এগুলি পুরানো। তবে এই উত্তরটি অন্যদের তুলনায় কম ভার্বোস এবং পড়া সহজ।
জোয়ি

4
@ জোয়ি এই যুক্তি নিয়ে তর্ক করতে পারে না, আমি মনে করি এই উত্তরটি এমন লোকদের পক্ষে বেশি উপযুক্ত যারা লাইব্রেরিটি সম্পর্কে আরও বুঝতে এবং জানার চেয়ে কেবল কাজ করার জন্য যে কোনও কিছু পেস্ট করার অনুলিপি খুঁজছেন। স্পর্শ।
সিএস 95

4
@ সিএস 95 হ্যাঁ আপনার উত্তর লোককে আরও শিখতে দেয়। এছাড়াও df ['new'] = 0 শিরোনামে হাইলাইট করা পঠনযোগ্যতার পক্ষে ভাল। আমিও তা উড়িয়ে দিয়েছি। Df.apply (ল্যাম্বদা x: 0, অক্ষ = 1) এর চেয়ে কম ভার্বোস
জোয়

7

ল্যাম্বডাস ব্যবহার করে এখানে আরও একটি লাইনার রয়েছে (ধ্রুবক মান = 10 দিয়ে কলাম তৈরি করুন)

df['newCol'] = df.apply(lambda x: 10, axis=1)

আগে

df
    A           B           C
1   1.764052    0.400157    0.978738
2   2.240893    1.867558    -0.977278
3   0.950088    -0.151357   -0.103219

পরে

df
        A           B           C           newCol
    1   1.764052    0.400157    0.978738    10
    2   2.240893    1.867558    -0.977278   10
    3   0.950088    -0.151357   -0.103219   10

4
df['newCol'] = 10এছাড়াও এটি একটি ওলাইনার (এবং দ্রুত)। এখানে প্রয়োগ ব্যবহার করে কী সুবিধা?
সিএস 95

4
এখানে আপনার সাথে প্রতিযোগিতা করার চেষ্টা করছেন না - কেবল একটি বিকল্প পদ্ধতির দেখায়।
গ্রান্ট শ্যানন

@ cs95 এটি সহায়ক। আমি একটি নতুন কলাম তৈরি করতে চেয়েছিলাম যেখানে প্রতিটি মান পৃথক খালি তালিকা। শুধুমাত্র এই পদ্ধতিটি কাজ করে।
ইয়থার্থ আগরওয়াল

@ ইয়থার্থ আগরওয়াল আমি আপনাকে এটি দিয়ে দেব, তবে এটিরও বোধ হয় যে প্রদত্ত পান্ডাগুলি তালিকার কলামগুলির সাথে ভালভাবে কাজ করার জন্য ডিজাইন করা হয়নি।
cs95

4
@ ইয়থার্থ আগরওয়াল যদি আপনার খালি তালিকা বরাদ্দ করতে হয় তবে এটি এখনও সাবপার সমাধান কারণ এটি প্রয়োগ ব্যবহার করে। চেষ্টা করুনdf['new'] = [[] for _ in range(len(df))]
cs95
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.