প্রতি নবম সারিতে পান্ডাস


114

ডেটাফ্রেম.সাম্পেল () কেবল টাইমসারিজ ডেটার সাথে কাজ করে। নন-টাইমসারিজ ডেটা থেকে প্রতিটি নবম সারি পাওয়ার কোনও উপায় আমি খুঁজে পাচ্ছি না। সবচেয়ে ভাল পদ্ধতি কি?

উত্তর:


213

আমি ব্যবহার করব iloc, যা পূর্ণসংখ্যার অবস্থানের ভিত্তিতে এবং সাধারণ অজগর সিনট্যাক্স অনুসরণ করে উভয়ই সারি / কলাম স্লাইস নেয়।

df.iloc[::5, :]

48
যারা চান তাদের জন্য উদাহরণস্বরূপ, প্রতি পঞ্চম সারিতে, তবে ২ য় সারিতে শুরু করা এটি হবে df.iloc[1::5, :]
লিটল ববি টেবিল

19
আপনি কলামের অংশটি বাদ দিতে পারেন:df.iloc[::5]
জোকি

4
@ ক্রিসব আমি কীভাবে প্রারম্ভিক সারিটি নির্দিষ্ট করব? প্রতি 5 সারির মতো, দ্বিতীয় সারি থেকে শুরু করে?
ফ্যাবিওস্প্যাগেটি

31

যদিও @ ক্রিসবের গৃহীত উত্তর প্রশ্নের উত্তর দেয় না, তবে আমি এটিতে নিম্নলিখিতটি যুক্ত করতে চাই।

nthডেটা পেতে বা nthসারি বাদ দেওয়ার জন্য আমি একটি সহজ পদ্ধতি ব্যবহার করি যা নিম্নলিখিত:

df1 = df[df.index % 3 != 0]  # Excludes every 3rd row starting from 0
df2 = df[df.index % 3 == 0]  # Selects every 3rd raw starting from 0

এই গাণিতিক ভিত্তিক নমুনাটিতে আরও জটিল সারি-নির্বাচন সক্ষম করার ক্ষমতা রয়েছে।

এটি অবশ্যই ধরে নিয়েছে যে আপনার কাছে ক্রমান্বয়ে অর্ডারযুক্ত একটি indexকলাম রয়েছে , 0 থেকে শুরু হওয়া পূর্ণসংখ্যার সংখ্যা


6
এটি একটি ভাল উত্তর নয় কারণ তিনটি অনুমান করা হয় যা প্রায়শই পূরণ হয় না: (1) সূচকটি সংখ্যাগত (2) সূচকটি শূন্যে শুরু হয় (3) সূচকের মান ক্রমাগত হয় ... শেষটি বিশেষত গুরুত্বপূর্ণ যেহেতু আপনি সূচকটি পুনরায় সেট না করে একবারে আপনার প্রস্তাবিত পদ্ধতিটি ব্যবহার করতে পারবেন না
কনস্টান্টাইন

4
তোমার যুক্তিটা বুঝেছি. অনুমানগুলি আরও সুস্পষ্ট করার জন্য উত্তরটি সম্পাদনা করবে ।
metastableB

4
@ কনস্ট্যান্টাইন এখনও, আপনি কেবল একটি সূচক যুক্ত করতে পারেন তাই এটি অন্যান্য সমাধানের চেয়ে দ্রুততর হবে না?
পাঠক

8

গ্রহণযোগ্য উত্তরের একটি আরও সহজ সমাধান রয়েছে যা সরাসরি আহ্বান জড়িত df.__getitem__

df = pd.DataFrame('x', index=range(5), columns=list('abc'))
df

   a  b  c
0  x  x  x
1  x  x  x
2  x  x  x
3  x  x  x
4  x  x  x

উদাহরণস্বরূপ, প্রতি 2 সারি পেতে, আপনি এটি করতে পারেন

df[::2]

   a  b  c
0  x  x  x
2  x  x  x
4  x  x  x

এছাড়াও GroupBy.first/ GroupBy.headআপনি সূচীতে গ্রুপ করুন:

df.index // 2
# Int64Index([0, 0, 1, 1, 2], dtype='int64')

df.groupby(df.index // 2).first()
# Alternatively,
# df.groupby(df.index // 2).head(1)

   a  b  c
0  x  x  x
1  x  x  x
2  x  x  x

সূচকটি ধাপে ধাপে বিভক্ত (2, এই ক্ষেত্রে)। সূচকটি যদি সংখ্যাসূচক হয় তবে পরিবর্তে এটি করুন

# df.groupby(np.arange(len(df)) // 2).first()
df.groupby(pd.RangeIndex(len(df)) // 2).first()

   a  b  c
0  x  x  x
1  x  x  x
2  x  x  x

1

আমার অনুরূপ প্রয়োজনীয়তা ছিল, তবে আমি একটি বিশেষ গ্রুপে n'ম আইটেমটি চেয়েছিলাম। এভাবেই সমাধান করেছি।

groups = data.groupby(['group_key'])
selection = groups['index_col'].apply(lambda x: x % 3 == 0)
subset = data[selection]

0

সূচকটি ব্যবহার করার সময় আমি যে সমাধানটি নিয়ে এসেছি তা কার্যকর ছিল না (সম্ভবত মাল্টি-জিগ .সিএসভি অনেক বড় ছিল, অথবা আমি এমন কোনও কৌশল মিস করেছি যা ক্রাশ না করে আমাকে পুনরায় প্রকাশ করতে দেয়)।
একসাথে এক সারিতে হাঁটুন এবং একটি নতুন ডেটাফ্রেমে নবম সারি যুক্ত করুন।

import pandas as pd
from csv import DictReader

def make_downsampled_df(filename, interval):    
    with open(filename, 'r') as read_obj:
        csv_dict_reader = DictReader(read_obj)
        column_names = csv_dict_reader.fieldnames
        df = pd.DataFrame(columns=column_names)
    
        for index, row in enumerate(csv_dict_reader):
            if index % interval == 0:
               print(str(row))
               df = df.append(row, ignore_index=True)

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