পাইথন পান্ডসে বিদ্যমান ডেটা ফ্রেমে নতুন কলাম যুক্ত করা হচ্ছে


978

নামযুক্ত কলাম এবং সারিগুলি নয়-অবিচ্ছিন্ন সংখ্যার সাথে আমার কাছে নিম্নলিখিত সূচকযুক্ত ডেটা ফ্রেম রয়েছে:

          a         b         c         d
2  0.671399  0.101208 -0.181532  0.241273
3  0.446172 -0.243316  0.051767  1.577318
5  0.614758  0.075793 -0.451460 -0.012493

আমি 'e'বিদ্যমান ডেটা ফ্রেমে একটি নতুন কলাম যুক্ত করতে চাই এবং ডেটা ফ্রেমে কোনও পরিবর্তন করতে চাই না (যেমন, নতুন কলামটির ডেটা ফ্রেমের সমান দৈর্ঘ্য থাকে)।

0   -0.335485
1   -1.166658
2   -0.385571
dtype: float64

আমি কীভাবে eউপরের উদাহরণে কলাম যুক্ত করতে পারি ?

উত্তর:


1043

সিরিজটি তৈরি করতে মূল ডিএফ 1 সূচকগুলি ব্যবহার করুন:

df1['e'] = pd.Series(np.random.randn(sLength), index=df1.index)

2015 সম্পাদনা করুন
কেউ কেউ SettingWithCopyWarningএই কোডটি পেয়েছে বলে জানিয়েছে ।
তবে কোডটি এখনও বর্তমান পান্ডাস সংস্করণ 0.16.1 এর সাথে পুরোপুরি চলে।

>>> sLength = len(df1['a'])
>>> df1
          a         b         c         d
6 -0.269221 -0.026476  0.997517  1.294385
8  0.917438  0.847941  0.034235 -0.448948

>>> df1['e'] = pd.Series(np.random.randn(sLength), index=df1.index)
>>> df1
          a         b         c         d         e
6 -0.269221 -0.026476  0.997517  1.294385  1.757167
8  0.917438  0.847941  0.034235 -0.448948  2.228131

>>> p.version.short_version
'0.16.1'

SettingWithCopyWarningলক্ষ্য Dataframe একটি কপি উপর একটি সম্ভবত অবৈধ নিয়োগ অবহিত। এটি অগত্যা না বলে যে আপনি এটি ভুল করেছেন (এটি মিথ্যা ইতিবাচক ট্রিগার করতে পারে) তবে 0.13.0 থেকে এটি আপনাকে জানায় যে একই উদ্দেশ্যে আরও পর্যাপ্ত পদ্ধতি রয়েছে। তারপরে, যদি আপনি সতর্কতা পান তবে কেবল তার পরামর্শ অনুসরণ করুন : পরিবর্তে .loc [row_index, col_indexer] = মান ব্যবহার করে দেখুন

>>> df1.loc[:,'f'] = pd.Series(np.random.randn(sLength), index=df1.index)
>>> df1
          a         b         c         d         e         f
6 -0.269221 -0.026476  0.997517  1.294385  1.757167 -0.050927
8  0.917438  0.847941  0.034235 -0.448948  2.228131  0.006109
>>> 

আসলে, পান্ডাস ডক্সে বর্ণিত হিসাবে এটি বর্তমানে আরও কার্যকর পদ্ধতি


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

মন্তব্যগুলিতে এবং @ আলেকজান্ডার দ্বারা নির্দেশিত হিসাবে, বর্তমানে ডেটাফ্রেমের নতুন কলাম হিসাবে সিরিজের মান যুক্ত করার জন্য সেরা পদ্ধতিটি ব্যবহার করা যেতে পারে assign:

df1 = df1.assign(e=pd.Series(np.random.randn(sLength)).values)

24
আপনি প্রয়োজন হলে শুরুতে যোগ df1.insert (0, 'এ', সিরিজ (np.random.randn (sLength), সূচক = df1.index)): কলাম ব্যবহার DataFrame.insert
lowtech

29
পান্ডসের সংস্করণ ০.০২ থেকে, আমি বিশ্বাস করি যে এই বাক্য SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_index,col_indexer] = value instead
গঠনটি

6
.Loc কে সেটিংউইথকপি হিসাবে সতর্কতা হিসাবে অনুসরণ করা একরকম আরও সতর্কতার ফলস্বরূপ: ... সেল্ফবজ [আইটেম_লবেলস [সূচক [তথ্য_এক্সিস]]] = মান
সেংজূ

12
@ টোটো_টিকো আপনি অভিধানটি আনপ্যাক করতে পারেন kwargs, এর মতো:df1 = df1.assign(**{'e': p.Series(np.random.randn(sLength)).values})
টিসি প্রক্টর

23
"বর্তমানে" বলার বা বছরগুলি উল্লেখ করার পরিবর্তে, দয়া করে পান্ডাস সংস্করণ সংখ্যাগুলি উল্লেখ করুন, যেমন "0.14-0.16 do X এর মধ্যে, 0.17+ তে Y করুন ..."
স্মি

229

এটি একটি নতুন কলাম যুক্ত করার সহজ উপায়: df['e'] = e


153
বেশি সংখ্যক ভোট সত্ত্বেও: এই উত্তরটি ভুল । দ্রষ্টব্য যে ওপিতে অবিচ্ছিন্ন সূচকগুলির সাথে একটি ডেটা ফ্রেম রয়েছে এবং e( Series(np.random.randn(sLength))) একটি সিরিজ 0-এন ইনডেক্স তৈরি করে। যদি আপনি এটি ডিএফ 1 এ নিয়োগ করেন তবে আপনি কিছু নাএন কোষ পাবেন।
joaquin

32
@ জোয়াকুইন যা বলেছে তা সত্য তবে আপনি যতক্ষণ তা মনে রাখবেন ততক্ষণ এটি একটি খুব দরকারী শর্টকাট।
বেদটপকার

2
@ এরিক লেসচিনস্কি: আপনি কীভাবে সম্পাদনা করবেন এই প্রশ্নের পক্ষে সহায়তা করবে তা নিশ্চিত নয় Not my_dataframe = pd.DataFrame(columns=('foo', 'bar'))। আপনার সম্পাদনাটি
ফিরিয়ে দেওয়া হচ্ছে

1
এটি কোনও সাহায্য করে না, কারণ আপনার যদি একাধিক সারি থাকে এবং আপনি যদি অ্যাসাইনমেন্ট ব্যবহার করেন তবে এটি নতুন কলামের সমস্ত সারিটিকে সেই মান (আপনার ক্ষেত্রে ই) দিয়ে সাইন করে যা সাধারণত অনাকাঙ্ক্ষিত।
পানিজ

156

আমি বিদ্যমান ডেটা ফ্রেমে একটি নতুন কলাম, 'ই' যুক্ত করতে চাই এবং ডেটা ফ্রেমে কোনও পরিবর্তন করব না। (সিরিজটি সর্বদা ডেটাফ্রেমের সমান দৈর্ঘ্য পেত।)

আমি ধরে নিই যে সূচকের মানগুলি এর সাথে eমেলে df1

নামে একটি নতুন কলাম শুরু করার সহজ উপায় eএবং এটি আপনার সিরিজ থেকে মানগুলি নির্ধারণ করুন e:

df['e'] = e.values

বরাদ্দ করুন (পান্ডাস 0.16.0+)

পান্ডাস 0.16.0 হিসাবে, আপনি এটিও ব্যবহার করতে পারেন assignযা একটি ডেটা ফ্রেমে নতুন কলামগুলি বরাদ্দ করে এবং নতুন কলামগুলি ছাড়াও সমস্ত মূল কলাম সহ একটি নতুন অবজেক্ট (একটি অনুলিপি) প্রদান করে।

df1 = df1.assign(e=e.values)

অনুযায়ী এই উদাহরণে (এটিও সোর্স কোড অন্তর্ভুক্ত assignফাংশন), এছাড়াও আপনি একটির বেশি কলামের অন্তর্ভুক্ত করতে পারে:

df = pd.DataFrame({'a': [1, 2], 'b': [3, 4]})
>>> df.assign(mean_a=df.a.mean(), mean_b=df.b.mean())
   a  b  mean_a  mean_b
0  1  3     1.5     3.5
1  2  4     1.5     3.5

আপনার উদাহরণের প্রসঙ্গে:

np.random.seed(0)
df1 = pd.DataFrame(np.random.randn(10, 4), columns=['a', 'b', 'c', 'd'])
mask = df1.applymap(lambda x: x <-0.7)
df1 = df1[-mask.any(axis=1)]
sLength = len(df1['a'])
e = pd.Series(np.random.randn(sLength))

>>> df1
          a         b         c         d
0  1.764052  0.400157  0.978738  2.240893
2 -0.103219  0.410599  0.144044  1.454274
3  0.761038  0.121675  0.443863  0.333674
7  1.532779  1.469359  0.154947  0.378163
9  1.230291  1.202380 -0.387327 -0.302303

>>> e
0   -1.048553
1   -1.420018
2   -1.706270
3    1.950775
4   -0.509652
dtype: float64

df1 = df1.assign(e=e.values)

>>> df1
          a         b         c         d         e
0  1.764052  0.400157  0.978738  2.240893 -1.048553
2 -0.103219  0.410599  0.144044  1.454274 -1.420018
3  0.761038  0.121675  0.443863  0.333674 -1.706270
7  1.532779  1.469359  0.154947  0.378163  1.950775
9  1.230291  1.202380 -0.387327 -0.302303 -0.509652

এই নতুন বৈশিষ্ট্যটি যখন এটি প্রথম চালু করা হয়েছিল তার বিবরণটি এখানে পাওয়া যাবে


2
দুটি পদ্ধতির আপেক্ষিক কর্মক্ষমতা সম্পর্কে কোনও মন্তব্য, বিবেচনা করে যে প্রথম পদ্ধতি ( df['e'] = e.values) ডেটাফ্রেমের একটি অনুলিপি তৈরি করে না, যখন দ্বিতীয় বিকল্পটি (ব্যবহার করে df.assign) কাজ করে? প্রচুর নতুন কলামগুলি ক্রমানুসারে এবং বৃহত ডেটাফ্রেমে যুক্ত হওয়ার ক্ষেত্রে আমি প্রথম পদ্ধতির আরও ভাল পারফরম্যান্সের আশা করছিলাম।
জ্বিন

2
@ ঝিন হ্যাঁ, আপনি যদি কোনও স্থির ডেটাফ্রেমে কাজ করে থাকেন তবে সরাসরি কাজ করা স্পষ্টতই অনেক বেশি। assignযখন আপনার ক্রিয়াকলাপগুলি একত্রিত করা হয় তখন ব্যবহারের সুবিধা ।
আলেকজান্ডার

এটি অবশ্যই সুস্পষ্ট এবং অন্তর্নিহিত মধ্যে একটি ভাল ভারসাম্য মত মনে হয়। +1: ডি
আবে হফম্যান

2
মজাদার জন্যdf.assign(**df.mean().add_prefix('mean_'))
পিআইআর স্কয়ারড

1
@ ওলাইটার্ট প্রশ্ন থেকে, এটি প্রদর্শিত হয় যে ওপি কেবল ডেটাফ্রেমগুলিকে সম্মতি দিচ্ছে এবং সূচকটিকে উপেক্ষা করছে। যদি এটি হয় তবে উপরের পদ্ধতিগুলি কার্যকর হবে। যদি কেউ সূচক ধরে রাখতে চান, তবে ডিফল্টরূপে df_new = pd.concat([df1, df2], axis=1)উল্লেখ করে এর মতো কিছু ব্যবহার করুন ignore_index=False
আলেকজান্ডার

51

দেখে মনে হচ্ছে সাম্প্রতিক পান্ডা সংস্করণগুলিতে যাওয়ার উপায় হল df.assign ব্যবহার করা :

df1 = df1.assign(e=np.random.randn(sLength))

এটি উত্পাদন করে না SettingWithCopyWarning


1
@ এসএমসি'র মন্তব্য উপরে থেকে অনুলিপি করা হচ্ছে ... "বর্তমানে" বলার বা বছরগুলি উল্লেখের পরিবর্তে দয়া করে পান্ডাস সংস্করণ সংখ্যাগুলি উল্লেখ করুন
কাইল সি

50

NumPy এর মাধ্যমে সরাসরি এটি করা সবচেয়ে কার্যকর হবে:

df1['e'] = np.random.randn(sLength)

নোট করুন আমার আসল (খুব পুরানো) পরামর্শটি ব্যবহার করার জন্য ছিল map(যা অনেক ধীর)

df1['e'] = df1['a'].map(lambda x: np.random.random())

1
আপনার জবাবের জন্য ধন্যবাদ, যেমন আমি ইতিমধ্যে দিয়েছি, এর .mapপরিবর্তে বিদ্যমান সিরিজগুলি ব্যবহার করার জন্য আমি কি আপনার কোডটি সংশোধন করতে পারি lambda? আমি চেষ্টা করি df1['e'] = df1['a'].map(lambda x: e)বা করি df1['e'] = df1['a'].map(e)তবে এটি আমার যা প্রয়োজন তা নয়। (আমি পাইহনে নতুন এবং আপনার পূর্ববর্তী উত্তর ইতিমধ্যে আমাকে সহায়তা করেছে)
tomasz74

@ টমাসজ already৪ যদি আপনার ইতিমধ্যে eসিরিজ হিসাবে থাকে তবে আপনার ব্যবহারের প্রয়োজন নেই map, df['e']=e(@ জাজোয়াকিন্স উত্তর)।
অ্যান্ডি হেডেন

49

সুপার সিম্পল কলাম অ্যাসাইনমেন্ট

একটি পান্ডাস ডেটা ফ্রেম কলামগুলির আদেশ আদেশ হিসাবে প্রয়োগ করা হয়।

এর অর্থ এই যে __getitem__ []কেবলমাত্র একটি নির্দিষ্ট কলামটি পেতে ব্যবহার করা যাবে না, তবে __setitem__ [] =একটি নতুন কলামটি বরাদ্দ করতে ব্যবহার করা যেতে পারে।

উদাহরণস্বরূপ, কেবলমাত্র []অ্যাক্সেসর ব্যবহার করে এই ডেটাফ্রেমে এটিতে একটি কলাম যুক্ত করা যেতে পারে

    size      name color
0    big      rose   red
1  small    violet  blue
2  small     tulip   red
3  small  harebell  blue

df['protected'] = ['no', 'no', 'no', 'yes']

    size      name color protected
0    big      rose   red        no
1  small    violet  blue        no
2  small     tulip   red        no
3  small  harebell  blue       yes

নোট করুন যে ডেটাফ্রেমের সূচি বন্ধ থাকলেও এটি কাজ করে।

df.index = [3,2,1,0]
df['protected'] = ['no', 'no', 'no', 'yes']
    size      name color protected
3    big      rose   red        no
2  small    violet  blue        no
1  small     tulip   red        no
0  small  harebell  blue       yes

[] = হ'ল উপায়, তবে নজর রাখুন!

তবে, যদি আপনার একটি থাকে pd.Seriesএবং সূচিগুলি বন্ধ থাকে এমন কোনও ডেটাফ্রেমে এটি নির্ধারণের চেষ্টা করেন, আপনি সমস্যায় পড়বেন। উদাহরণ দেখুন:

df['protected'] = pd.Series(['no', 'no', 'no', 'yes'])
    size      name color protected
3    big      rose   red       yes
2  small    violet  blue        no
1  small     tulip   red        no
0  small  harebell  blue        no

এটি কারণ pd.Seriesডিফল্টরূপে 0 থেকে n পর্যন্ত সূচকযুক্ত থাকে। এবং পান্ডাস [] =পদ্ধতিটি "স্মার্ট" হওয়ার চেষ্টা করে

আসলে কি চলছে।

আপনি যখন [] =পদ্ধতিটি ব্যবহার করেন পান্ডগুলি বাম হাতের ডেটাফ্রেমের সূচক এবং ডান হাতের সিরিজের সূচকটি ব্যবহার করে নিঃশব্দে একটি বাহ্যিক যোগ বা বাহ্যিক সংশ্লেষ সম্পাদন করে।df['column'] = series

সাইড নোট

এটি দ্রুত জ্ঞানীয় অসন্তোষ সৃষ্টি করে, যেহেতু []=পদ্ধতিটি ইনপুটটির উপর নির্ভর করে অনেকগুলি বিভিন্ন কাজ করার চেষ্টা করছে এবং পান্ডগুলি কীভাবে কাজ করে তা আপনি যদি না জানেন তবে ফলাফলটির পূর্বাভাস দেওয়া যায় না । সুতরাং আমি []=কোড বেসগুলির বিরুদ্ধে পরামর্শ দেব , কিন্তু যখন কোনও নোটবুকে ডেটা অন্বেষণ করা হয়, এটি ঠিক আছে।

সমস্যা ঘুরতে যাওয়া

যদি আপনার একটি থাকে pd.Seriesএবং এটি শীর্ষ থেকে নীচে পর্যন্ত নির্ধারিত হতে চান, বা আপনি যদি উত্পাদনশীল কোড কোডিং করছেন এবং আপনি সূচী আদেশের বিষয়ে নিশ্চিত নন তবে এই ধরণের ইস্যুটির জন্য এটি রক্ষা করা উপযুক্ত worth

আপনি pd.Seriesএকটি np.ndarrayবা একটিকে হ্রাস করতে পারেন list, এটি কৌশলটি করবে।

df['protected'] = pd.Series(['no', 'no', 'no', 'yes']).values

অথবা

df['protected'] = list(pd.Series(['no', 'no', 'no', 'yes']))

তবে এটি খুব স্পষ্ট নয়।

কিছু কোডার সাথে আসতে পারে এবং বলতে পারে "আরে, এগুলি অপ্রয়োজনীয় দেখায়, আমি কেবল এটিকে অপ্টিমাইজ করব"।

সুস্পষ্ট উপায়

সূচক নির্ধারণ pd.Seriesকরা সূচী dfস্পষ্ট হয়।

df['protected'] = pd.Series(['no', 'no', 'no', 'yes'], index=df.index)

বা আরও বাস্তবে, আপনার সম্ভবত pd.Seriesইতিমধ্যে একটি উপলব্ধ আছে available

protected_series = pd.Series(['no', 'no', 'no', 'yes'])
protected_series.index = df.index

3     no
2     no
1     no
0    yes

এখন নিয়োগ দেওয়া যেতে পারে

df['protected'] = protected_series

    size      name color protected
3    big      rose   red        no
2  small    violet  blue        no
1  small     tulip   red        no
0  small  harebell  blue       yes

সঙ্গে বিকল্প উপায় df.reset_index()

যেহেতু সূচকের বিচ্ছিন্নতা সমস্যা, আপনি যদি মনে করেন যে ডেটাফ্রেমের সূচকে জিনিসগুলি নির্ধারণ করা উচিত নয়, আপনি কেবল সূচকটি ফেলে দিতে পারেন, এটি দ্রুত হওয়া উচিত, তবে এটি খুব পরিষ্কার নয়, যেহেতু আপনার ফাংশন সম্ভবত দুটি কাজ করে।

df.reset_index(drop=True)
protected_series.reset_index(drop=True)
df['protected'] = protected_series

    size      name color protected
0    big      rose   red        no
1  small    violet  blue        no
2  small     tulip   red        no
3  small  harebell  blue       yes

নোট অন df.assign

যদিও df.assignএটিকে অনেক বেশী সুনিদৃষ্ট আপনি কি করছেন, এটা আসলে উপরের মতো একই সমস্যা রয়েছে[]=

df.assign(protected=pd.Series(['no', 'no', 'no', 'yes']))
    size      name color protected
3    big      rose   red       yes
2  small    violet  blue        no
1  small     tulip   red        no
0  small  harebell  blue        no

শুধু সঙ্গে সতর্ক df.assignআপনার কলাম বলা হয় না self। এটি ত্রুটি ঘটবে। এটি df.assign গন্ধযুক্ত করে তোলে , যেহেতু ফাংশনে এই ধরণের শিল্পকর্ম রয়েছে।

df.assign(self=pd.Series(['no', 'no', 'no', 'yes'])
TypeError: assign() got multiple values for keyword argument 'self'

আপনি বলতে পারেন, "ঠিক আছে, আমি selfতখনই ব্যবহার করব না "। তবে কে জানে ভবিষ্যতে নতুন যুক্তি সমর্থন করার জন্য এই ফাংশনটি কীভাবে পরিবর্তিত হয়। প্যান্ডাসের নতুন আপডেটে আপনার কলামের নামটি যুক্তি হয়ে উঠবে, আপগ্রেড করার ক্ষেত্রে সমস্যা তৈরি করবে।


6
" আপনি যখন [] =পদ্ধতিটি ব্যবহার করেন পান্ডা চুপচাপ একটি বাহ্যিক যোগদান বা বাহ্যিক সংযোজন করছেন "। এটি পুরো বিষয়বস্তুতে তথ্যগুলির সবচেয়ে গুরুত্বপূর্ণ অংশ। তবে আপনি কীভাবে []=অপারেটর কাজ করে তার অফিসিয়াল ডকুমেন্টেশনের লিঙ্ক সরবরাহ করতে পারেন ?
লাইটম্যান

25

সবচেয়ে সহজ উপায়: -

data['new_col'] = list_of_values

data.loc[ : , 'new_col'] = list_of_values

এইভাবে আপনি পান্ডস অবজেক্টে নতুন মান নির্ধারণের সময় যাকে চেইনড ইনডেক্সিং বলা হয় তা এড়াতে পারেন। আরও পড়তে এখানে ক্লিক করুন


23

আপনি যদি পুরো নতুন কলামটিকে প্রাথমিক বেস মান (যেমন None) তে সেট করতে চান তবে আপনি এটি করতে পারেন:df1['e'] = None

এটি প্রকৃতপক্ষে ঘরটিতে "অবজেক্ট" টাইপ বরাদ্দ করবে। সুতরাং পরে আপনি পৃথক কক্ষে জটিল ডাটা টাইপগুলি, যেমন তালিকার মতো রাখতে পারেন


1
এটি কপিওয়াইয়ারিং সহ একটি সেটিংস উত্থাপন করে
00__00__00

1
df ['E'] = '' কাজ করে যদি কেউ একটি খালি কলাম যুক্ত করতে চায়
debaonline4u

21

আমি ভয় পেয়েছিলাম SettingWithCopyWarning, এবং এটি আইলোক সিনট্যাক্স ব্যবহার করে ঠিক করা হয়নি। আমার ডেটাফ্রেম একটি ওডিবিসি উত্স থেকে পঠন_এসকিউএল দ্বারা তৈরি করা হয়েছিল। উপরের দিকে লোটেক দ্বারা একটি পরামর্শ ব্যবহার করে, নিম্নলিখিতগুলি আমার পক্ষে কাজ করেছে:

df.insert(len(df.columns), 'e', pd.Series(np.random.randn(sLength),  index=df.index))

এটি শেষে কলামটি সন্নিবেশ করানোর জন্য দুর্দান্ত কাজ করেছে। আমি জানি না এটি সবচেয়ে দক্ষ কিনা, তবে আমি সতর্কতা বার্তা পছন্দ করি না। আমি মনে করি এর থেকে আরও ভাল সমাধান আছে তবে আমি এটি খুঁজে পাচ্ছি না এবং আমি মনে করি এটি সূচকের কোনও দিকের উপর নির্ভর করে।
নোট । এটি কেবল একবারে কাজ করে এবং ওভাররাইট ও বিদ্যমান কলামটি চেষ্টা করার চেষ্টা করলে একটি ত্রুটি বার্তা দেয়।
দ্রষ্টব্য উপরের হিসাবে এবং 0.16.0 থেকে নির্ধারণ করা সেরা সমাধান। ডকুমেন্টেশন দেখুন http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.assign.html#pandas.DataFrame.assign ডেটা ফ্লো টাইপের জন্য ভাল কাজ করে যেখানে আপনি নিজের মধ্যবর্তী মানগুলি ওভাররাইট করেন না।


এটিই একমাত্র উপায় যা 2019 এর জন্য আমার পক্ষে কাজ করে!
হাইড্রডন

14
  1. প্রথমে একটি অজগর তৈরি করুন list_of_eযার প্রাসঙ্গিক ডেটা রয়েছে।
  2. এটা ব্যবহার কর: df['e'] = list_of_e

1
আমি সত্যিই বুঝতে পারি না, কেন এটি পছন্দসই উত্তর নয়। আপনার যদি পিডি.সারিজ থাকে তবে tolist()কমান্ডটি সহায়ক হতে পারে।
সুতরাং 16

11

আপনি যে কলামটি যুক্ত করার চেষ্টা করছেন তা যদি একটি সিরিজ পরিবর্তনশীল হয় তবে ঠিক:

df["new_columns_name"]=series_variable_name #this will do it for you

আপনি যদি বিদ্যমান কলামটি প্রতিস্থাপন করছেন এমনকি এটি ভাল কাজ করে just আপনি যে কলামটি প্রতিস্থাপন করতে চান তার মতোই নতুন_কলামগুলি_নাম টাইপ করুন t এটি কেবল নতুন সিরিজের ডেটা সহ বিদ্যমান কলামের ডেটা ওভাররাইট করবে।


10

তথ্য ফ্রেম এবং সিরিজ বস্তুর থাকে তাহলে একই সূচক , pandas.concatএখানে কাজ করে:

import pandas as pd
df
#          a            b           c           d
#0  0.671399     0.101208   -0.181532    0.241273
#1  0.446172    -0.243316    0.051767    1.577318
#2  0.614758     0.075793   -0.451460   -0.012493

e = pd.Series([-0.335485, -1.166658, -0.385571])    
e
#0   -0.335485
#1   -1.166658
#2   -0.385571
#dtype: float64

# here we need to give the series object a name which converts to the new  column name 
# in the result
df = pd.concat([df, e.rename("e")], axis=1)
df

#          a            b           c           d           e
#0  0.671399     0.101208   -0.181532    0.241273   -0.335485
#1  0.446172    -0.243316    0.051767    1.577318   -1.166658
#2  0.614758     0.075793   -0.451460   -0.012493   -0.385571

যদি তাদের একই সূচক না থাকে:

e.index = df.index
df = pd.concat([df, e.rename("e")], axis=1)

10

অব্যর্থ:

df.loc[:, 'NewCol'] = 'New_Val'

উদাহরণ:

df = pd.DataFrame(data=np.random.randn(20, 4), columns=['A', 'B', 'C', 'D'])

df

           A         B         C         D
0  -0.761269  0.477348  1.170614  0.752714
1   1.217250 -0.930860 -0.769324 -0.408642
2  -0.619679 -1.227659 -0.259135  1.700294
3  -0.147354  0.778707  0.479145  2.284143
4  -0.529529  0.000571  0.913779  1.395894
5   2.592400  0.637253  1.441096 -0.631468
6   0.757178  0.240012 -0.553820  1.177202
7  -0.986128 -1.313843  0.788589 -0.707836
8   0.606985 -2.232903 -1.358107 -2.855494
9  -0.692013  0.671866  1.179466 -1.180351
10 -1.093707 -0.530600  0.182926 -1.296494
11 -0.143273 -0.503199 -1.328728  0.610552
12 -0.923110 -1.365890 -1.366202 -1.185999
13 -2.026832  0.273593 -0.440426 -0.627423
14 -0.054503 -0.788866 -0.228088 -0.404783
15  0.955298 -1.430019  1.434071 -0.088215
16 -0.227946  0.047462  0.373573 -0.111675
17  1.627912  0.043611  1.743403 -0.012714
18  0.693458  0.144327  0.329500 -0.655045
19  0.104425  0.037412  0.450598 -0.923387


df.drop([3, 5, 8, 10, 18], inplace=True)

df

           A         B         C         D
0  -0.761269  0.477348  1.170614  0.752714
1   1.217250 -0.930860 -0.769324 -0.408642
2  -0.619679 -1.227659 -0.259135  1.700294
4  -0.529529  0.000571  0.913779  1.395894
6   0.757178  0.240012 -0.553820  1.177202
7  -0.986128 -1.313843  0.788589 -0.707836
9  -0.692013  0.671866  1.179466 -1.180351
11 -0.143273 -0.503199 -1.328728  0.610552
12 -0.923110 -1.365890 -1.366202 -1.185999
13 -2.026832  0.273593 -0.440426 -0.627423
14 -0.054503 -0.788866 -0.228088 -0.404783
15  0.955298 -1.430019  1.434071 -0.088215
16 -0.227946  0.047462  0.373573 -0.111675
17  1.627912  0.043611  1.743403 -0.012714
19  0.104425  0.037412  0.450598 -0.923387

df.loc[:, 'NewCol'] = 0

df
           A         B         C         D  NewCol
0  -0.761269  0.477348  1.170614  0.752714       0
1   1.217250 -0.930860 -0.769324 -0.408642       0
2  -0.619679 -1.227659 -0.259135  1.700294       0
4  -0.529529  0.000571  0.913779  1.395894       0
6   0.757178  0.240012 -0.553820  1.177202       0
7  -0.986128 -1.313843  0.788589 -0.707836       0
9  -0.692013  0.671866  1.179466 -1.180351       0
11 -0.143273 -0.503199 -1.328728  0.610552       0
12 -0.923110 -1.365890 -1.366202 -1.185999       0
13 -2.026832  0.273593 -0.440426 -0.627423       0
14 -0.054503 -0.788866 -0.228088 -0.404783       0
15  0.955298 -1.430019  1.434071 -0.088215       0
16 -0.227946  0.047462  0.373573 -0.111675       0
17  1.627912  0.043611  1.743403 -0.012714       0
19  0.104425  0.037412  0.450598 -0.923387       0

2
বোকা নয়। এটি ওপি-র প্রশ্নের সমাধান করে না, এটি এমন একটি ক্ষেত্রে যেখানে বিদ্যমান ডেটাফ্রেমের সূচকগুলি এবং নতুন সিরিজটি সারিবদ্ধ করা হয়নি।
আলেকজান্ডার 19

7

আমাকে কেবল এটি যুক্ত করতে দাও, যেমন হাম 3 এর মতো , .locসমাধান করেনি SettingWithCopyWarningএবং আমাকে অবলম্বন করতে হয়েছিল df.insert()। আমার ক্ষেত্রে ভুয়া পজিটিভ "জাল" চেইন ইনডেক্সিং দ্বারা উত্পাদিত হয়েছিল dict['a']['e'], 'e'নতুন কলামটি কোথায় , এবং dict['a']অভিধান থেকে আসা একটি ডেটা ফ্রেম।

এছাড়াও মনে রাখবেন যে আপনি কী করছেন তা যদি আপনি জানেন তবে আপনি pd.options.mode.chained_assignment = None এখানে প্রদত্ত অন্যান্য সমাধানগুলির মধ্যে একটি ব্যবহার করে সতর্কতাটি স্যুইচ করতে পারেন ।


7

একটি ডেটা ফ্রেমে একটি নির্দিষ্ট স্থানে (0 <= লোক <= কলামগুলির পরিমাণ) এ একটি নতুন কলাম সন্নিবেশ করানোর জন্য, কেবল ডেটাফ্রেম.ইন্ট্রেট ব্যবহার করুন:

DataFrame.insert(loc, column, value)

অতএব, আপনি যদি df নামক ডেটা ফ্রেমের শেষে কলামটি যুক্ত করতে চান তবে আপনি এটি ব্যবহার করতে পারেন:

e = [-0.335485, -1.166658, -0.385571]    
DataFrame.insert(loc=len(df.columns), column='e', value=e)

মান হ'ল সিরিজ, একটি পূর্ণসংখ্যা (এই ক্ষেত্রে সমস্ত ঘর এই মান দ্বারা পূর্ণ হয়) বা অ্যারের মতো কাঠামো হতে পারে

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.insert.html


6

একটি নতুন কলাম বরাদ্দ করার আগে, যদি আপনার সূচী ডেটা থাকে, আপনার সূচিটি বাছাই করতে হবে। কমপক্ষে আমার ক্ষেত্রে আমাকে:

data.set_index(['index_column'], inplace=True)
"if index is unsorted, assignment of a new column will fail"        
data.sort_index(inplace = True)
data.loc['index_value1', 'column_y'] = np.random.randn(data.loc['index_value1', 'column_x'].shape[0])

6

একটি বিষয় লক্ষ্য রাখবেন, তবে তা হ'ল যদি তা করেন

df1['e'] = Series(np.random.randn(sLength), index=df1.index)

এটি কার্যকরভাবে df1.index এ একটি বাম যোগ হবে। সুতরাং আপনি যদি কোনও বাহ্যিক যোগদানের প্রভাব রাখতে চান তবে আমার সম্ভবত অসম্পূর্ণ সমাধানটি হ'ল আপনার ডেটাটির মহাবিশ্বকে coveringেকে রেখে সূচকের মান সহ একটি ডেটাফ্রেম তৈরি করা এবং তারপরে উপরের কোডটি ব্যবহার করুন। উদাহরণ স্বরূপ,

data = pd.DataFrame(index=all_possible_values)
df1['e'] = Series(np.random.randn(sLength), index=df1.index)

5

আমি numpy.nanবোবা না পেয়ে ডেটাফ্রেমে এস এর কলাম যুক্ত করার একটি সাধারণ উপায় সন্ধান করছিলাম SettingWithCopyWarning

নিম্নলিখিত থেকে:

  • উত্তর এখানে
  • একটি কীওয়ার্ড আর্গুমেন্ট হিসাবে একটি ভেরিয়েবল পাস সম্পর্কে এই প্রশ্ন
  • numpyইন-লাইন NaNs এর অ্যারে তৈরির জন্য এই পদ্ধতি

আমি এটি নিয়ে এসেছি:

col = 'column_name'
df = df.assign(**{col:numpy.full(len(df), numpy.nan)})


4

সম্পূর্ণতার স্বার্থে - ডেটাফ্রেম.এভাল () পদ্ধতিটি ব্যবহার করে অন্য একটি সমাধান :

ডেটা:

In [44]: e
Out[44]:
0    1.225506
1   -1.033944
2   -0.498953
3   -0.373332
4    0.615030
5   -0.622436
dtype: float64

In [45]: df1
Out[45]:
          a         b         c         d
0 -0.634222 -0.103264  0.745069  0.801288
4  0.782387 -0.090279  0.757662 -0.602408
5 -0.117456  2.124496  1.057301  0.765466
7  0.767532  0.104304 -0.586850  1.051297
8 -0.103272  0.958334  1.163092  1.182315
9 -0.616254  0.296678 -0.112027  0.679112

সমাধান:

In [46]: df1.eval("e = @e.values", inplace=True)

In [47]: df1
Out[47]:
          a         b         c         d         e
0 -0.634222 -0.103264  0.745069  0.801288  1.225506
4  0.782387 -0.090279  0.757662 -0.602408 -1.033944
5 -0.117456  2.124496  1.057301  0.765466 -0.498953
7  0.767532  0.104304 -0.586850  1.051297 -0.373332
8 -0.103272  0.958334  1.163092  1.182315  0.615030
9 -0.616254  0.296678 -0.112027  0.679112 -0.622436

4

একটি খালি কলাম তৈরি করতে

df['i'] = None

3

নিম্নলিখিতটি আমি যা করেছি তা হল ... তবে আমি সাধারণভাবে পান্ডা এবং সত্যই পাইথনে নতুন, তাই কোনও প্রতিশ্রুতি নেই।

df = pd.DataFrame([[1, 2], [3, 4], [5,6]], columns=list('AB'))

newCol = [3,5,7]
newName = 'C'

values = np.insert(df.values,df.shape[1],newCol,axis=1)
header = df.columns.values.tolist()
header.append(newName)

df = pd.DataFrame(values,columns=header)

3

যদি আপনি এটি পান তবে SettingWithCopyWarningএকটি সহজ ফিক্স হ'ল আপনি যে কলামে কলাম যুক্ত করার চেষ্টা করছেন সেই ডেটা ফ্রেমটি অনুলিপি করা।

df = df.copy()
df['col_name'] = values

10
এটি একটি ভাল ধারণা নয়। যদি ডেটাফ্রেমটি যথেষ্ট পরিমাণে বড় হয় তবে এটি স্মৃতিশক্তি নিবিড় হতে পারে ... এছাড়াও যদি আপনি একবারে একবারে কলাম যুক্ত করে রাখেন তবে এটি একটি দুঃস্বপ্নে পরিণত হবে।
কেভাদ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.