পান্ডাস ডেটা ফ্রেমে একটি সারি Inোকান


112

আমার একটি ডেটাফ্রেম রয়েছে:

s1 = pd.Series([5, 6, 7])
s2 = pd.Series([7, 8, 9])

df = pd.DataFrame([list(s1), list(s2)],  columns =  ["A", "B", "C"])

   A  B  C
0  5  6  7
1  7  8  9

[2 rows x 3 columns]

এবং পেতে আমাকে প্রথম সারিতে [2, 3, 4] যোগ করতে হবে:

   A  B  C
0  2  3  4
1  5  6  7
2  7  8  9

আমি চেষ্টা করেছি append()এবং concat()ফাংশন করেছি তবে কীভাবে এটি করা যায় তার সঠিক উপায় খুঁজে পাচ্ছি না।

ডেটাফ্রেমে সিরিজ কীভাবে যুক্ত / যুক্ত করবেন?


6
মনে রাখবেন যে আপনি সম্পূর্ণ নতুন তালিকা ব্যবহার করে তৈরি করবেন তার s1.valuesবিপরীতে ব্যবহার করা আরও ভাল । list(s1)list(s1)
একুশনার

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

উত্তর:


145

কেবলমাত্র একটি নির্দিষ্ট সূচকে সারি নির্ধারণ করুন, এটি ব্যবহার করে loc:

 df.loc[-1] = [2, 3, 4]  # adding a row
 df.index = df.index + 1  # shifting index
 df = df.sort_index()  # sorting by index

এবং আপনি যেমন চান তা পাবেন:

    A  B  C
 0  2  3  4
 1  5  6  7
 2  7  8  9

পান্ডাস ডকুমেন্টেশন ইনডেক্সিংয়ে দেখুন: বর্ধনের সাথে সেট করা


2
আপনি পরিবর্ধন সঙ্গে সেট, কিন্তু dataframe ভিতরে সন্নিবেশ করতে না চান, কটাক্ষপাত আছে stackoverflow.com/questions/15888648/...
FOOBAR

6
স্থানান্তর সূচক বিকল্প: df.sort ()। রিসেট_ইন্ডেক্স (ড্রপ = সত্য)
মেলুন

2
df.sort হ্রাস করা হয়েছে, df.sort_index () ব্যবহার করুন
GBGOLC

1
@ পাইওটার - এটি দুর্দান্ত কাজ করে, তবে যখন আপনি আপনার ডেটা ফ্রেম থেকে কোনও সারিটি নকল করতে চান df.loc[-1] = df.iloc[[0]]এবং সন্নিবেশ করতে চান তখন কি হবে ? ফ্রেমটি একটি যুক্ত সূচক কলাম দেওয়ার সময় ত্রুটি নিয়ে আসে ValueError: cannot set a row with mismatched columns (দেখুন স্ট্যাকওভারফ্লো / প্রশ্নগুলি / 73৩73০৫7171১/২ )
গ্রোলার

5
আমি মনে করি df.loc[-1] = [2, 3, 4] # adding a rowএটি কিছুটা বিভ্রান্তিমূলক, -1এটি শেষ সারি / উপাদান নয়, যেমন পাইথন অ্যারেগুলির জন্য।
ফ্লো 2 কে

26

আপনি কীভাবে কল করছেন concat()তা নিশ্চিত নয় তবে যতক্ষণ না উভয় বস্তু একই ধরণের হয় ততক্ষণ এটি কাজ করা উচিত। হয়তো সমস্যাটি হ'ল আপনার দ্বিতীয় ভেক্টরকে ডেটাফ্রেমে কাস্ট করা দরকার? আপনি আমার জন্য নিম্নলিখিত কাজগুলি সংজ্ঞায়িত করেছেন এমন ডিএফ ব্যবহার করে:

df2 = pd.DataFrame([[2,3,4]], columns=['A','B','C'])
pd.concat([df2, df])


23

এটি অর্জনের একটি উপায়

>>> pd.DataFrame(np.array([[2, 3, 4]]), columns=['A', 'B', 'C']).append(df, ignore_index=True)
Out[330]: 
   A  B  C
0  2  3  4
1  5  6  7
2  7  8  9

সাধারণত, সিরিজ নয়, ডেটাফ্রেমগুলি সংযোজন করা সহজ। আপনার ক্ষেত্রে, যেহেতু আপনি চান যে নতুন সারিটি "শীর্ষে" হওয়া উচিত (শুরু আইডি সহ), এবং কোনও কার্যকারিতা নেই pd.prepend(), তাই আমি প্রথমে নতুন ডেটাফ্রেম তৈরি করি এবং তারপরে আপনার পুরানোটি যুক্ত করব।

ignore_indexআপনার ডেটাফ্রেমে পুরানো চলমান সূচকটিকে উপেক্ষা করবে এবং নিশ্চিত করবে যে প্রথম সারিটি সূচক 1দিয়ে পুনরায় আরম্ভ করার পরিবর্তে সূচক দিয়ে শুরু করবে 0

সাধারণ অস্বীকৃতি: সেটারো সেনসো ... সারি যুক্ত করা বেশ কার্যকর অপারেশন। আপনি যদি পারফরম্যান্সের বিষয়ে যত্নশীল হন এবং কোনওভাবে প্রথমে সঠিক (দীর্ঘতর) সূচক সহ একটি ডেটাফ্রেম তৈরি করা এবং তারপরে ডেটাফ্রেমে অতিরিক্ত সারি সন্নিবেশ করাতে নিশ্চিত করতে পারেন তবে অবশ্যই আপনার এটি করা উচিত। দেখা:

>>> index = np.array([0, 1, 2])
>>> df2 = pd.DataFrame(columns=['A', 'B', 'C'], index=index)
>>> df2.loc[0:1] = [list(s1), list(s2)]
>>> df2
Out[336]: 
     A    B    C
0    5    6    7
1    7    8    9
2  NaN  NaN  NaN
>>> df2 = pd.DataFrame(columns=['A', 'B', 'C'], index=index)
>>> df2.loc[1:] = [list(s1), list(s2)]

এখনও অবধি, আপনার যা ছিল তা আমাদের কাছে রয়েছে df:

>>> df2
Out[339]: 
     A    B    C
0  NaN  NaN  NaN
1    5    6    7
2    7    8    9

তবে এখন আপনি নিম্নরূপে সহজেই সারিটি সন্নিবেশ করতে পারেন। স্থানটি যেহেতু পূর্বনির্ধারিত ছিল তাই এটি আরও কার্যকর।

>>> df2.loc[0] = np.array([2, 3, 4])
>>> df2
Out[341]: 
   A  B  C
0  2  3  4
1  5  6  7
2  7  8  9

এটি দুর্দান্ত কাজের সমাধান, আমি ডেটাফ্রেমে সিরিজ sertোকানোর চেষ্টা করছিলাম। এই মুহুর্তে এটি আমার পক্ষে যথেষ্ট ভাল।
মেলুন

আমি সবচেয়ে শেষ বিকল্পটি পছন্দ করি। এটি সত্যই আমি যা করতে চাই তার সাথে মেলে। আপনাকে ধন্যবাদ @ ফুবার!
জেড কচো

13

আমি একটি সংক্ষিপ্ত ফাংশন একসাথে রেখেছি যা একটি সারি সন্নিবেশ করার সময় কিছুটা নমনীয়তার সুযোগ দেয়:

def insert_row(idx, df, df_insert):
    dfA = df.iloc[:idx, ]
    dfB = df.iloc[idx:, ]

    df = dfA.append(df_insert).append(dfB).reset_index(drop = True)

    return df

যা আরও সংক্ষিপ্ত করা যেতে পারে:

def insert_row(idx, df, df_insert):
    return df.iloc[:idx, ].append(df_insert).append(df.iloc[idx:, ]).reset_index(drop = True)

তারপরে আপনি এর মতো কিছু ব্যবহার করতে পারেন:

df = insert_row(2, df, df_new)

যেখানে 2সূচক অবস্থান dfযেখানে আপনি সন্নিবেশ করতে চান df_new


7

আমরা ব্যবহার করতে পারি numpy.insert। এতে নমনীয়তার সুবিধা রয়েছে। আপনি কেবল যে সূচিটি sertোকাতে চান তা নির্দিষ্ট করতে হবে।

s1 = pd.Series([5, 6, 7])
s2 = pd.Series([7, 8, 9])

df = pd.DataFrame([list(s1), list(s2)],  columns =  ["A", "B", "C"])

pd.DataFrame(np.insert(df.values, 0, values=[2, 3, 4], axis=0))

    0   1   2
0   2   3   4
1   5   6   7
2   7   8   9

যেহেতু np.insert(df.values, 0, values=[2, 3, 4], axis=0)0 আপনাকে নতুন মানগুলি স্থাপন করতে চান সেই স্থান / সূচকটি ফাংশনটি বলে।


6

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

df.loc[0] = [row1data, blah...]
i = len(df) + 1
df.loc[i] = [row2data, blah...]

আপনার কোডটি দেখায়, আপনার অর্থ কি "নতুন ডিএফ যোগ করা" বা কেবল "একটি নতুন সারি সংযোজন" করা উচিত?
স্মি

দুঃখিত আমার বাক্য পরিষ্কার ছিল না। আমি অন্যান্য লোকেদের সমাধানগুলি পড়েছি যা কেবলমাত্র একটি একক সারিতে সম্পূর্ণ নতুন ডেটাফ্রেমে সংঘবদ্ধ / সংযোজন করে। তবে আমার সমাধানে এটি বিদ্যমান ডাটাফ্রেমের কেবল একটি একক সারিতে অতিরিক্ত ডেটাফ্রেম তৈরি করার দরকার নেই
অ্যারন

6

নীচে সূচকটি বাছাই এবং পুনরায় নির্ধারণ না করে পান্ডাস ডেটা ফ্রেমে সারি সন্নিবেশ করার সর্বোত্তম উপায় হবে:

import pandas as pd

df = pd.DataFrame(columns=['a','b','c'])

def insert(df, row):
    insert_loc = df.index.max()

    if pd.isna(insert_loc):
        df.loc[0] = row
    else:
        df.loc[insert_loc + 1] = row

insert(df,[2,3,4])
insert(df,[8,9,0])
print(df)

কেন আপনি বলবেন যে এটি সর্বোত্তম উপায়?
ইউকা

তাহলে সেই দাবির পক্ষে প্রমাণ দেওয়ার জন্য ভাল লাগবে, আপনি কি সময় কাটিয়েছেন?
ইউকা

1
আপনি পিপি.আইএসএনএ ব্যবহার করতে পারেন নাম্পি আমদানি এড়াতে
kato2

2

পান্ডায় একটি সারি যুক্ত করা বেশ সহজ DataFrame:

  1. আপনার মতো একই কলামের নাম সহ একটি নিয়মিত পাইথন অভিধান তৈরি করুন Dataframe;

  2. pandas.append()আপনার অভিধানের নামে পদ্ধতি এবং পাস ব্যবহার করুন , যেখানে .append()ডেটা ফ্রেমের উদাহরণগুলিতে একটি পদ্ধতি রয়েছে;

  3. ignore_index=Trueআপনার অভিধানের নাম পরে ডান যুক্ত করুন ।


এটি সম্ভবত সবচেয়ে পছন্দনীয় বিকল্প (প্রায় 2020)।
ডেভিড গোলম্বিওস্কি

1

concat()শেষ সারি সন্নিবেশ এবং পুনর্নির্মাণের চেয়ে কিছুটা দ্রুত বলে মনে হচ্ছে। ক্ষেত্রে কেউ দুটি শীর্ষ পদ্ধতির গতি সম্পর্কে অবাক হবে:

In [x]: %%timeit
     ...: df = pd.DataFrame(columns=['a','b'])
     ...: for i in range(10000):
     ...:     df.loc[-1] = [1,2]
     ...:     df.index = df.index + 1
     ...:     df = df.sort_index()

প্রতি লুপে 17.1 এস ms 705 এমএস (7 of রানের গড় dev স্ট্যান্ড। ডিভ। প্রতিটি লুপ প্রতিটি)

In [y]: %%timeit
     ...: df = pd.DataFrame(columns=['a', 'b'])
     ...: for i in range(10000):
     ...:     df = pd.concat([pd.DataFrame([[1,2]], columns=df.columns), df])

6.53 s ± 127 এমএস প্রতি লুপে (মানে ± স্ট্যান্ড ডেভেল ডেভেল runs রানের, প্রতিটি 1 টি লুপ)


0

আপনি কেবল ডাটাফ্রেমের শেষে সারি যুক্ত করতে পারেন এবং তারপরে সূচকটি সামঞ্জস্য করতে পারেন।

এই ক্ষেত্রে:

df = df.append(pd.DataFrame([[2,3,4]],columns=df.columns),ignore_index=True)
df.index = (df.index + 1) % len(df)
df = df.sort_index()

বা concatহিসাবে ব্যবহার করুন :

df = pd.concat([pd.DataFrame([[1,2,3,4,5,6]],columns=df.columns),df],ignore_index=True)

-1

পান্ডাস ডেটা ফ্রেমে সারি যুক্ত করার সহজ উপায় হ'ল:

DataFrame.loc[ location of insertion ]= list( )

উদাহরণ:

DF.loc[ 9 ] = [ ´Pepe , 33, ´Japan ]

নোট: আপনার তালিকার দৈর্ঘ্য ডেটা ফ্রেমের সাথে মেলে।


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