পান্ডাস ডাটাফ্রেম থেকে কীভাবে সারিগুলির একটি তালিকা ড্রপ করবেন?


257

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

>>> df
                  sales  discount  net_sales    cogs
STK_ID RPT_Date                                     
600141 20060331   2.709       NaN      2.709   2.245
       20060630   6.590       NaN      6.590   5.291
       20060930  10.103       NaN     10.103   7.981
       20061231  15.915       NaN     15.915  12.686
       20070331   3.196       NaN      3.196   2.710
       20070630   7.907       NaN      7.907   6.459

তারপরে আমি নির্দিষ্ট ক্রম সংখ্যার সাথে সারিগুলি ড্রপ করতে চাই যা একটি তালিকায় নির্দেশিত হয়েছে, ধরুন এখানে এখানে [1,2,4],পরে রেখে দেওয়া হয়েছে:

                  sales  discount  net_sales    cogs
STK_ID RPT_Date                                     
600141 20060331   2.709       NaN      2.709   2.245
       20061231  15.915       NaN     15.915  12.686
       20070630   7.907       NaN      7.907   6.459

কীভাবে বা কী ফাংশন এটি করতে পারে?


কেবল স্পষ্ট করে বলতে গেলে, এই প্রশ্নটি নির্দিষ্ট সূচক মানগুলির সাথে সারিগুলি ফেলে দেওয়ার বিষয়ে .. তাদের [1,2,4] এর ব্যবহারটি ড্রপ করার পরে বাম সারির দিকে ইঙ্গিত করা । নীচে উত্তর রয়েছে যা এটি করে।
আলকেমি

উত্তর:


386

ডেটাফ্রেম.ড্রপ ব্যবহার করুন এবং এটি সূচি লেবেলগুলির একটি সিরিজ পাস করুন :

In [65]: df
Out[65]: 
       one  two
one      1    4
two      2    3
three    3    2
four     4    1


In [66]: df.drop(df.index[[1,3]])
Out[66]: 
       one  two
one      1    4
three    3    2

18
+1 এ ছাড়া, শেষ সারিটি df.DP (df.tail (1) .index) বাদ দিন
নাসের আল-ওহাইবি

15
এই উত্তরটি কেবল তখনই কাজ করে যদি df.index.unique () df.index এর সমান হয়, যা কোনও পান্ডাস ডেটা ফ্রেমের প্রয়োজন হয় না। যখন df.index মানগুলি অনন্য হওয়ার গ্যারান্টিযুক্ত না থাকে তখন কি কারও সমাধান হয়?
জে জোন্স

2
এই স্বল্পতা সূচক নাম নিজেই সূচক আপনাকে অনুমতি দেয়
Ingrid

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

2
পাইথনে নতুন আগত: নোট করুন যে আপনি যদি এই সারিগুলি ফেলে দিতে চান এবং সেগুলি একই ডেটাফ্রেমে (অন্তর্নিহিত) সংরক্ষণ করতে চান তবে আপনাকে axis=0(0 = সারি, 1 = কলাম) এবং এর inplace=Trueহিসাবেও যুক্ত করতে হবে df.drop(df.index[[1,3]], axis=0, inplace=True)। @ মিজানাকসিও, আপনি যদি নির্দিষ্টভাবে জানেন যে কোন সূচিগুলি আপনি প্রতিস্থাপন করতে চান (এবং আপনার 0 থেকে n উদাহরণও ব্যবহার করছেন):df.drop(df.index[range(0, n)], axis=0, inplace=True)
এমআরবিটিটি

112

মনে রাখবেন যে আপনি যখন ড্রপ ইন লাইনে করতে চান তখন "ইনপ্লেস" কমান্ডটি ব্যবহার করা গুরুত্বপূর্ণ হতে পারে।

df.drop(df.index[[1,3]], inplace=True)

কারণ আপনার আসল প্রশ্নটি কোনও কিছুই ফেরত যাচ্ছে না, এই আদেশটি ব্যবহার করা উচিত। http://pandas.pydata.org/pandas-docs/version/0.17.0/generated/pandas.DataFrame.drop.html


47

যদি ডেটাফ্রেম বিশাল হয় এবং ড্রপ করার জন্য সারিগুলির সংখ্যাও বড় হয়, তবে সূচকের দ্বারা সাধারণ ড্রপটিতে df.drop(df.index[])খুব বেশি সময় লাগে।

আমার ক্ষেত্রে, আমার সাথে ভাসমানগুলির একটি বহু-ইনডেক্সযুক্ত ডেটাফ্রেম রয়েছে 100M rows x 3 colsএবং আমার 10kএটি থেকে সারিগুলি সরিয়ে ফেলতে হবে। আমি যে দ্রুততম পদ্ধতিটি পেয়েছি তা হ'ল বেশিরভাগ takeক্ষেত্রে অবশিষ্ট সারিগুলির মতো to

যাক indexes_to_dropঅবস্থানগত ইনডেক্স একটি অ্যারের (ড্রপ হতে [1, 2, 4]প্রশ্নে)।

indexes_to_keep = set(range(df.shape[0])) - set(indexes_to_drop)
df_sliced = df.take(list(indexes_to_keep))

আমার ক্ষেত্রে এই নেন 20.5s, যখন সহজ df.dropনেন 5min 27sএবং মেমরি অনেক পুড়িয়ে ফেলল। ফলাফল ডেটা ফ্রেম একই।


43

এছাড়াও আপনি পাস করতে পারেন DataFrame.drop ট্যাগ নিজেই (পরিবর্তে সূচী লেবেলের সিরিজ):

In[17]: df
Out[17]: 
            a         b         c         d         e
one  0.456558 -2.536432  0.216279 -1.305855 -0.121635
two -1.015127 -0.445133  1.867681  2.179392  0.518801

In[18]: df.drop('one')
Out[18]: 
            a         b         c         d         e
two -1.015127 -0.445133  1.867681  2.179392  0.518801

যা সমান:

In[19]: df.drop(df.index[[0]])
Out[19]: 
            a         b         c         d         e
two -1.015127 -0.445133  1.867681  2.179392  0.518801

1
df.DP (df.index [0]) এছাড়াও কাজ করে। আমার অর্থ, ডাবল স্কোয়ার_ ব্র্যাকেটের দরকার নেই (কমপক্ষে প্যান্ডাস 0.18.1 সহ)
ট্যাগোমা

23

আমি এটি একটি সহজ উপায়ে সমাধান করেছি - মাত্র 2 টি ধাপে।

পদক্ষেপ 1: প্রথমে অযাচিত সারি / ডেটা সহ ডেটা ফ্রেম তৈরি করুন।

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

উদাহরণ:

মনে করুন আপনার কাছে ডেটাফ্রেম ডিএফ রয়েছে যা 'বয়স' সহ অনেকগুলি কলাম যা একটি পূর্ণসংখ্যা। এখন ধরা যাক আপনি 'বয়স' সহ সমস্ত সারি নেতিবাচক সংখ্যা হিসাবে ফেলে দিতে চান।

পদক্ষেপ 1: df_age_negative = df [df ['বয়স'] <0]

পদক্ষেপ 2: ডিএফ = ডিএফ.ড্রপ (df_age_negative.index, অক্ষ = 0)

আশা করি এটি অনেক সহজ এবং আপনাকে সহায়তা করবে।


1
+1, এটিই কেবলমাত্র উত্তর যা আপনাকে জানায় যে প্রথমটি থেকে পৃথক কলাম নির্বাচন করে একটি সারি কীভাবে সরিয়ে ফেলতে হয়।
আলেজো বার্নার্ডিন

10

আমি যদি একটি সারি বাদ দিতে চাই যা সূচককে বলে দেয় x, আমি নিম্নলিখিতগুলি করব:

df = df[df.index != x]

যদি আমি একাধিক সূচক বাদ দিতে চাই (এই সূচকগুলি তালিকায় রয়েছে বলে দিন unwanted_indices), আমি এটি করব:

desired_indices = [i for i in len(df.index) if i not in unwanted_indices]
desired_df = df.iloc[desired_indices]

6

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

ind_drop = df[df['column_of_strings'].apply(lambda x: x.startswith('Keyword'))].index

এবং এখন তাদের সূচকগুলি ব্যবহার করে সেই সারিগুলি ফেলে দেওয়া

new_df = df.drop(ind_drop)

3

@ থিওড্রোস-জেল্লেকের উত্তরে একটি মন্তব্যে, @ জে-জোন্স সূচকটি অনন্য না হলে কী করতে হবে সে সম্পর্কে জিজ্ঞাসা করেছিলেন। আমাকে এমন পরিস্থিতি মোকাবেলা করতে হয়েছিল। আমি যা করেছি তা হ'ল আমি drop()লা ডাকার আগে সূচীতে সদৃশদের নামকরণ করে :

dropped_indexes = <determine-indexes-to-drop>
df.index = rename_duplicates(df.index)
df.drop(df.index[dropped_indexes], inplace=True)

rename_duplicates()এমন একটি ফাংশন যেখানে আমি সংজ্ঞায়িত করেছি যা সূচকের উপাদানগুলির মধ্য দিয়ে গেছে এবং সদৃশগুলির নাম পরিবর্তন করে। আমি pd.read_csv()কলামগুলিতে একই নাম পরিবর্তনকরণ প্যাটার্নটি ব্যবহার করেছি, যেমন, সারিটির নাম "%s.%d" % (name, count)কোথায় nameএবং countএটি এর আগে কতবার হয়েছিল।


1

উপরে বর্ণিত হিসাবে বুলিয়ান থেকে সূচক নির্ধারণ করা

df[df['column'].isin(values)].index

এই পদ্ধতিটি ব্যবহার করে সূচি নির্ধারণের চেয়ে আরও মেমরি নিবিড় হতে পারে

pd.Index(np.where(df['column'].isin(values))[0])

যেমন প্রয়োগ করা

df.drop(pd.Index(np.where(df['column'].isin(values))[0]), inplace = True)

বড় ডেটাফ্রেম এবং সীমিত মেমরির সাথে ডিল করার সময় এই পদ্ধতিটি কার্যকর।


0

সারি বাদ দেওয়ার জন্য কেবল সূচক আর্গ ব্যবহার করুন: -

df.drop(index = 2, inplace = True)

একাধিক সারির জন্য: -

df.drop(index=[1,3], inplace = True)

0

উদাহরণস্বরূপ ডেটাফ্রেম বিবেচনা করুন

df =     
index    column1
0           00
1           10
2           20
3           30

আমরা 2 য় এবং 3 য় সূচক সারি বাদ দিতে চাই।

পন্থা 1:

df = df.drop(df.index[2,3])
 or 
df.drop(df.index[2,3],inplace=True)
print(df)

df =     
index    column1
0           00
3           30

 #This approach removes the rows as we wanted but the index remains unordered

পদ্ধতির ঘ

df.drop(df.index[2,3],inplace=True,ignore_index=True)
print(df)
df =     
index    column1
0           00
1           30
#This approach removes the rows as we wanted and resets the index. 
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.