ডেটাফ্রেম.সাম্পেল () কেবল টাইমসারিজ ডেটার সাথে কাজ করে। নন-টাইমসারিজ ডেটা থেকে প্রতিটি নবম সারি পাওয়ার কোনও উপায় আমি খুঁজে পাচ্ছি না। সবচেয়ে ভাল পদ্ধতি কি?
উত্তর:
আমি ব্যবহার করব iloc
, যা পূর্ণসংখ্যার অবস্থানের ভিত্তিতে এবং সাধারণ অজগর সিনট্যাক্স অনুসরণ করে উভয়ই সারি / কলাম স্লাইস নেয়।
df.iloc[::5, :]
df.iloc[::5]
যদিও @ ক্রিসবের গৃহীত উত্তর প্রশ্নের উত্তর দেয় না, তবে আমি এটিতে নিম্নলিখিতটি যুক্ত করতে চাই।
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 থেকে শুরু হওয়া পূর্ণসংখ্যার সংখ্যা ।
গ্রহণযোগ্য উত্তরের একটি আরও সহজ সমাধান রয়েছে যা সরাসরি আহ্বান জড়িত 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
আমার অনুরূপ প্রয়োজনীয়তা ছিল, তবে আমি একটি বিশেষ গ্রুপে n'ম আইটেমটি চেয়েছিলাম। এভাবেই সমাধান করেছি।
groups = data.groupby(['group_key'])
selection = groups['index_col'].apply(lambda x: x % 3 == 0)
subset = data[selection]
সূচকটি ব্যবহার করার সময় আমি যে সমাধানটি নিয়ে এসেছি তা কার্যকর ছিল না (সম্ভবত মাল্টি-জিগ .সিএসভি অনেক বড় ছিল, অথবা আমি এমন কোনও কৌশল মিস করেছি যা ক্রাশ না করে আমাকে পুনরায় প্রকাশ করতে দেয়)।
একসাথে এক সারিতে হাঁটুন এবং একটি নতুন ডেটাফ্রেমে নবম সারি যুক্ত করুন।
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
df.iloc[1::5, :]
।