এক অ্যাসাইনমেন্টে পান্ডাস ডেটা ফ্রেমে একাধিক কলাম কীভাবে যুক্ত করবেন?


121

আমি পান্ডে নতুন এবং কীভাবে একসাথে পান্ডায় একাধিক কলাম যুক্ত করতে হবে তা জানার চেষ্টা করছি। এখানে যে কোনও সহায়তা প্রশংসিত হয়। আদর্শভাবে আমি একাধিক পুনরাবৃত্তি পদক্ষেপের চেয়ে এক ধাপে এটি করতে চাই ...

import pandas as pd

df = {'col_1': [0, 1, 2, 3],
        'col_2': [4, 5, 6, 7]}
df = pd.DataFrame(df)

df[[ 'column_new_1', 'column_new_2','column_new_3']] = [np.nan, 'dogs',3]  #thought this would work here...

আপনি কী ত্রুটি পেয়েছেন তা আপনাকে জানিয়ে দেওয়া দরকার। আমি যখন KeyError: "None of [Index(['column_new_1', 'column_new_2', 'column_new_3'], dtype='object')] are in the [columns]"
পান্ডাস

উত্তর:


183

আমি আপনার সিনট্যাক্সটিও কাজ করবে বলে আশা করতাম। সমস্যা দেখা দেয় কারণ আপনি যখন কলাম-তালিকা সিনট্যাক্স ( df[[new1, new2]] = ...) দিয়ে নতুন কলাম তৈরি করবেন তখন পান্ডাদের ডান হাতের একটি ডেটাফ্রেম হওয়া প্রয়োজন (নোট করুন যে ডেটাফ্রেমের কলামগুলিতে কলামগুলির মতো একই নাম রয়েছে কিনা তা আসলে বিবেচ্য নয়) আপনি তৈরি করছেন)।

আপনার সিনট্যাক্স বিদ্যমান কলামগুলিতে স্কেলারের মান নির্ধারণের জন্য সূক্ষ্মভাবে কাজ করে , এবং পান্ডাস সিঙ্গল-কলাম সিনট্যাক্স ( df[new1] = ...) ব্যবহার করে নতুন কলামে স্কেলারের মান নির্ধারণেও খুশি । সুতরাং সমাধানটি হয় বেশ কয়েকটি একক-কলাম অ্যাসাইনমেন্টগুলিতে রূপান্তর করা, বা ডান হাতের জন্য উপযুক্ত ডেটা ফ্রেম তৈরি করা।

এখানে বেশ কয়েকটি পদ্ধতি যা কাজ করবে :

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'col_1': [0, 1, 2, 3],
    'col_2': [4, 5, 6, 7]
})

তারপরে নিম্নলিখিতগুলির একটি:

1) তালিকায় আনপ্যাকিং ব্যবহার করে একটিতে তিনটি অ্যাসাইনমেন্ট:

df['column_new_1'], df['column_new_2'], df['column_new_3'] = [np.nan, 'dogs', 3]

2) DataFrameসূচকটি মেলানোর জন্য সুবিধামত একটি একক সারি প্রসারিত করে, তাই আপনি এটি করতে পারেন:

df[['column_new_1', 'column_new_2', 'column_new_3']] = pd.DataFrame([[np.nan, 'dogs', 3]], index=df.index)

3) নতুন কলামগুলির সাথে একটি অস্থায়ী ডেটা ফ্রেম তৈরি করুন, তারপরে পরে মূল ডেটা ফ্রেমের সাথে একত্রিত করুন:

df = pd.concat(
    [
        df,
        pd.DataFrame(
            [[np.nan, 'dogs', 3]], 
            index=df.index, 
            columns=['column_new_1', 'column_new_2', 'column_new_3']
        )
    ], axis=1
)

4) আগের মত, কিন্তু এর joinপরিবর্তে concat(কম দক্ষ হতে পারে) ব্যবহার:

df = df.join(pd.DataFrame(
    [[np.nan, 'dogs', 3]], 
    index=df.index, 
    columns=['column_new_1', 'column_new_2', 'column_new_3']
))

5) ডিক ব্যবহার করা আগের দুটি তুলনায় নতুন ডেটা ফ্রেম তৈরি করার আরও "প্রাকৃতিক" উপায়, তবে নতুন কলামগুলি বর্ণমালা অনুসারে বাছাই করা হবে (কমপক্ষে পাইথনের ৩.6 বা ৩.7 এর আগে ):

df = df.join(pd.DataFrame(
    {
        'column_new_1': np.nan,
        'column_new_2': 'dogs',
        'column_new_3': 3
    }, index=df.index
))

6) .assign()একাধিক কলাম আর্গুমেন্ট সঙ্গে ব্যবহার করুন ।

আমি @ শূন্যের উত্তরে এই বৈকল্পিকটি পছন্দ করি তবে পূর্ববর্তীটির মতো নতুন কলামগুলিও সর্বদা বর্ণানুক্রমিকভাবে সাজানো হবে, কমপক্ষে পাইথনের প্রাথমিক সংস্করণগুলির সাথে:

df = df.assign(column_new_1=np.nan, column_new_2='dogs', column_new_3=3)

)) এটি আকর্ষণীয় ( https://stackoverflow.com/a/44951376/3830997 এর উপর ভিত্তি করে ) তবে কখন সমস্যার জন্য উপযুক্ত হবে তা আমি জানি না:

new_cols = ['column_new_1', 'column_new_2', 'column_new_3']
new_vals = [np.nan, 'dogs', 3]
df = df.reindex(columns=df.columns.tolist() + new_cols)   # add empty cols
df[new_cols] = new_vals  # multi-column assignment works for existing cols

8) শেষ পর্যন্ত তিনটি পৃথক কার্যকে পরাস্ত করা শক্ত:

df['column_new_1'] = np.nan
df['column_new_2'] = 'dogs'
df['column_new_3'] = 3

দ্রষ্টব্য: এই বিকল্পগুলির মধ্যে অনেকগুলি ইতিমধ্যে অন্যান্য উত্তরে coveredাকা পড়েছে : ডেটাফ্রেমে একাধিক কলাম যুক্ত করুন এবং সেগুলি একটি বিদ্যমান কলামের সমান সেট করুন , প্যান্ডাস ডেটা ফ্রেমের সাথে একবারে কয়েকটি কলাম যুক্ত করা সম্ভব? , পান্ডাস ডেটা ফ্রেমে একাধিক খালি কলাম যুক্ত করুন


# 7 ( .reindex) এর কাছে যাবেন না যা ডেটাফ্রেমের সূচকে পরিবর্তন করে? স্পষ্ট লক্ষ্য না থাকলে কেউ কলাম যুক্ত করার সময় কেন
অনাকাঙ্ক্ষিতভাবে

1
.reindex()columnsযুক্তি সহ ব্যবহৃত হয় , সুতরাং এটি কেবল কলাম "সূচি" (নাম) পরিবর্তন করে names এটি সারি সূচকে পরিবর্তন করে না।
ম্যাথিয়া ফ্রিপ

কিছু পদ্ধতির জন্য, আপনি ব্যবহার করতে পারেন OrderedDict: উদাহরণস্বরূপ,df.join(pd.DataFrame( OrderedDict([('column_new_2', 'dogs'),('column_new_1', np.nan),('column_new_3', 3)]), index=df.index ))
হ্যাশমুক

@ হাশমুকে এটি পাইথনের প্রাথমিক সংস্করণগুলির জন্য অর্থবোধ করে। এটি বিশেষত পান্ডাসে একাধিক জিনিসের জন্য অভিধান ব্যবহার করা লোকদের কাছে আবেদন করতে পারে, যেমন, df = pd.DataFrame({'before': [1, 2, 3], 'after': [4, 5, 6]})বনামdf = pd.DataFrame(OrderedDict([('before', [1, 2, 3]), ('after', [4, 5, 6])])
ম্যাথিয়াস ফ্রিপ

2
আপনি যদি বিকল্পটি ব্যবহার করে যাচ্ছেন তবে joinনিশ্চিত হয়ে নিন যে আপনার সূচীতে নকল নেই (বা একটি reset_indexপ্রথম ব্যবহার করুন ) use আপনাকে কয়েক ঘন্টা ডিবাগ করতে পারে।
গাইডো

40

আপনি assignকলামের নাম এবং মানগুলির একটি ডিক দিয়ে ব্যবহার করতে পারেন ।

In [1069]: df.assign(**{'col_new_1': np.nan, 'col2_new_2': 'dogs', 'col3_new_3': 3})
Out[1069]:
   col_1  col_2 col2_new_2  col3_new_3  col_new_1
0      0      4       dogs           3        NaN
1      1      5       dogs           3        NaN
2      2      6       dogs           3        NaN
3      3      7       dogs           3        NaN

কলামগুলির নির্দিষ্ট ক্রম বজায় রাখার মতো কী করার কোনও উপায় আছে?
ব্যবহারকারী 48956

1
আপনি পাইথনের পূর্ববর্তী সংস্করণগুলির সাথে একাধিকবার কল করে একটি নির্দিষ্ট ক্রম বজায় রাখতে পারেন: df.assign(**{'col_new_1': np.nan}).assign(**{'col2_new_2': 'dogs'}).assign(**{'col3_new_3': 3})
স্ক্র্যাচ

9

কনক্যাট ব্যবহারের সাথে :

In [128]: df
Out[128]: 
   col_1  col_2
0      0      4
1      1      5
2      2      6
3      3      7

In [129]: pd.concat([df, pd.DataFrame(columns = [ 'column_new_1', 'column_new_2','column_new_3'])])
Out[129]: 
   col_1  col_2 column_new_1 column_new_2 column_new_3
0    0.0    4.0          NaN          NaN          NaN
1    1.0    5.0          NaN          NaN          NaN
2    2.0    6.0          NaN          NaN          NaN
3    3.0    7.0          NaN          NaN          NaN

আপনি কী করতে চেয়েছিলেন তা সম্পর্কে খুব নিশ্চিত নন [np.nan, 'dogs',3]। সম্ভবত এখন সেগুলি ডিফল্ট মান হিসাবে সেট করুন?

In [142]: df1 = pd.concat([df, pd.DataFrame(columns = [ 'column_new_1', 'column_new_2','column_new_3'])])
In [143]: df1[[ 'column_new_1', 'column_new_2','column_new_3']] = [np.nan, 'dogs', 3]

In [144]: df1
Out[144]: 
   col_1  col_2  column_new_1 column_new_2  column_new_3
0    0.0    4.0           NaN         dogs             3
1    1.0    5.0           NaN         dogs             3
2    2.0    6.0           NaN         dogs             3
3    3.0    7.0           NaN         dogs             3

যদি এক ধাপে আপনার দ্বিতীয় অংশটি করার কোনও উপায় ছিল - উদাহরণস্বরূপ কলামগুলিতে হ্যাঁ ধ্রুবক মান।
রানিংবার্ড

3

তালিকা বোঝার ব্যবহার, pd.DataFrameএবংpd.concat

pd.concat(
    [
        df,
        pd.DataFrame(
            [[np.nan, 'dogs', 3] for _ in range(df.shape[0])],
            df.index, ['column_new_1', 'column_new_2','column_new_3']
        )
    ], axis=1)

এখানে চিত্র বর্ণনা লিখুন


3

যদি একই মান সহ প্রচুর অনুপস্থিত কলাম (a, b, c, ....) যোগ করে থাকে তবে এখানে 0, আমি এটি করেছি:

    new_cols = ["a", "b", "c" ] 
    df[new_cols] = pd.DataFrame([[0] * len(new_cols)], index=df.index)

এটি গৃহীত উত্তরের দ্বিতীয় বৈকল্পিকের ভিত্তিতে।


0

@ ম্যাথিয়াস ফ্রিপ্প এর উত্তরে সেই অপশন 2টিকে কেবল উল্লেখ করতে চাই

(২) আমি অবশ্যই ডেটা ফ্রেমটি এভাবে কাজ করার আশা করি না, তবে তা করে

ডিএফ [['' কলাম_নিউ_উইউ ',' কলাম_নেউ_২ ',' কলাম_নিউইউ_3 ']] = পিডি.ডাটা ফ্রেম ([[এনপি। নান,' কুকুর ', ৩]]], সূচক = df.index)

ইতিমধ্যে পান্ডাসের নিজস্ব ডকুমেন্টেশনে নথিভুক্ত করা হয়েছে http://pandas.pydata.org/pandas-docs/stable/indexing.html#basics

সেই ক্রমে কলামগুলি নির্বাচন করতে আপনি [] তে কলামগুলির একটি তালিকা পাস করতে পারেন। যদি কোনও কলাম ডেটা ফ্রেমে না থাকে তবে একটি ব্যতিক্রম উত্থাপিত হবে। একাধিক কলামও এই পদ্ধতিতে সেট করা যেতে পারে। আপনি কলামগুলির একটি উপসেটে ট্রান্সফর্ম ( ইন-প্লেস ) প্রয়োগ করার জন্য এটি দরকারী বলে মনে করতে পারেন ।


আমি মনে করি এটি বহু-কলাম অ্যাসাইনমেন্টের জন্য বেশ মানক। যে অংশটি আমাকে অবাক pd.DataFrame([[np.nan, 'dogs', 3]], index=df.index)করেছিল তা হ'ল সূচকগুলির মতো একই দৈর্ঘ্যের একটি সম্পূর্ণ ডেটা ফ্রেম তৈরি করতে দেওয়া এক সারিটির প্রতিলিপি তৈরি করে।
ম্যাথিয়া ফ্রিপ

0

আপনি যদি খালি নতুন কলামগুলি যুক্ত করতে চান তবে রিইন্ডেক্স কাজটি করবে

df
   col_1  col_2
0      0      4
1      1      5
2      2      6
3      3      7

df.reindex(list(df)+['column_new_1', 'column_new_2','column_new_3'], axis=1)
   col_1  col_2  column_new_1  column_new_2  column_new_3
0      0      4           NaN           NaN           NaN
1      1      5           NaN           NaN           NaN
2      2      6           NaN           NaN           NaN
3      3      7           NaN           NaN           NaN

সম্পূর্ণ কোড উদাহরণ

import numpy as np
import pandas as pd

df = {'col_1': [0, 1, 2, 3],
        'col_2': [4, 5, 6, 7]}
df = pd.DataFrame(df)
print('df',df, sep='\n')
print()
df=df.reindex(list(df)+['column_new_1', 'column_new_2','column_new_3'], axis=1)
print('''df.reindex(list(df)+['column_new_1', 'column_new_2','column_new_3'], axis=1)''',df, sep='\n')

অন্যথায় নির্ধারিত জিরো উত্তর জন্য যান


0

আমি "সূচক" ব্যবহার করে স্বাচ্ছন্দ্য বোধ করি না ইত্যাদিও ... নীচের মত উঠে আসতে পারে

df.columns
Index(['A123', 'B123'], dtype='object')

df=pd.concat([df,pd.DataFrame(columns=list('CDE'))])

df.rename(columns={
    'C':'C123',
    'D':'D123',
    'E':'E123'
},inplace=True)


df.columns
Index(['A123', 'B123', 'C123', 'D123', 'E123'], dtype='object')
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.