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


1940

আমার কাছে DataFrameপান্ডা থেকে এসেছে:

import pandas as pd
inp = [{'c1':10, 'c2':100}, {'c1':11,'c2':110}, {'c1':12,'c2':120}]
df = pd.DataFrame(inp)
print df

আউটপুট:

   c1   c2
0  10  100
1  11  110
2  12  120

এখন আমি এই ফ্রেমের সারিগুলিতে পুনরাবৃত্তি করতে চাই। প্রতিটি সারির জন্য আমি কলামগুলির নামে এর উপাদানগুলিতে (কক্ষগুলির মানগুলি) অ্যাক্সেস করতে সক্ষম হতে চাই। উদাহরণ স্বরূপ:

for row in df.rows:
   print row['c1'], row['c2']

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

আমি এই একই প্রশ্ন পেয়েছি । তবে এটি আমার প্রয়োজনীয় উত্তর দেয় না। উদাহরণস্বরূপ, এটি ব্যবহার করার পরামর্শ দেওয়া হয়েছে:

for date, row in df.T.iteritems():

অথবা

for row in df.iterrows():

তবে আমি বুঝতে পারি না যে rowজিনিসটি কী এবং এটি দিয়ে কীভাবে কাজ করতে পারি।


11
Df.iteitems () কলামগুলিতে পুনরাবৃত্তি করে এবং সারিগুলি নয়। সুতরাং, সারিগুলিতে এটি পুনরাবৃত্তি করতে আপনাকে আপনাকে ("টি") স্থানান্তর করতে হবে, যার অর্থ আপনি সারি এবং কলামগুলি একে অপরের মধ্যে পরিবর্তন করেছেন (তির্যকটি প্রতিফলিত করুন)। ফলস্বরূপ, আপনি df.T.iteitems ()
স্টেফান গ্রুইনওয়াল্ড

11
আপনি যদি এই থ্রেডে নতুন হন এবং পান্ডসের জন্য শিক্ষানবিস হন, তবে এটি ব্যবহার করবেন না !! ডেটাফ্রেমে ওভার আইট্রেটেশন হ'ল একটি অ্যান্টি-প্যাটার্ন, এবং এমন কিছু যা আপনার করা উচিত নয় যদি না আপনি প্রচুর অপেক্ষা করতে অভ্যস্ত হন। আপনি যা করার চেষ্টা করছেন তার উপর নির্ভর করে সম্ভবত আরও অনেক ভাল বিকল্প রয়েছেiter*ফাংশনগুলি খুব বিরল পরিস্থিতিতে ব্যবহার করা উচিত। সম্পর্কিত
cs95

18
সিএস 95 যা বলেছে তার বিপরীতে, কোনও ডেটাফ্রেমের মাধ্যমে পুনরাবৃত্তি করতে চাওয়ার সঠিক কারণ রয়েছে, সুতরাং নতুন ব্যবহারকারীদের নিরুৎসাহিত হওয়া উচিত নয়। একটি উদাহরণ হ'ল যদি আপনি প্রতিটি সারির মানগুলি ইনপুট হিসাবে ব্যবহার করে কিছু কোড প্রয়োগ করতে চান। এছাড়াও, যদি আপনার ডেটাফ্রেম যুক্তিসঙ্গতভাবে ছোট হয় (উদাহরণস্বরূপ 1000 আইটেমের চেয়ে কম), পারফরম্যান্সটি আসলে সমস্যা নয়।

1
@ ওলেঞ্জ: যদি কোনও অদ্ভুত কারণে আপনি এপিআইটি যে উদ্দেশ্যে (উচ্চ-পারফরম্যান্স ডেটা ট্রান্সফর্মেশন) এর জন্য ডিজাইন করা হয়েছিল সেটির জন্য ব্যবহার করতে চান, তবে আমার অতিথি হয়ে উঠুন। তবে খুব কমপক্ষে, ব্যবহার করবেন না iterrows, কোনও ডাটাফ্রেমের মাধ্যমে পুনরাবৃত্তি করার আরও ভাল উপায় রয়েছে, আপনি কেবলমাত্র সেই সময়ে তালিকার তালিকার উপরে পুনরাবৃত্তি করতে পারেন। আপনি যদি এমন স্থানে থাকেন যেখানে আপনি ডেটাফ্রেমগুলি পুনরাবৃত্তি করা ছাড়া কিছুই করছেন না, তবে ডেটাফ্রেমটি ব্যবহার করার কোনও সুবিধা নেই (এটি পুনরুক্তি করা একমাত্র জিনিস যা আপনি এটি করছেন)। শুধু আমার 2 সি।
CS95

7
আমি দ্বিতীয় @ ওলেঞ্জ। আমি যতটুকু বলতে পারি pandasসিএসভি ফাইলের পড়া-যাওয়া পছন্দ যদিও ডেটাসেট ছোট ছোট। এপিআই দিয়ে ডেটা ম্যানিপুলেট করা সহজতর প্রোগ্রামিং
ক্রিস

উত্তর:


2623

ডেটাফ্রেম.িটেরোজ এমন একটি জেনারেটর যা সূচক এবং সারি উভয়ই দেয়

import pandas as pd
import numpy as np

df = pd.DataFrame([{'c1':10, 'c2':100}, {'c1':11,'c2':110}, {'c1':12,'c2':120}])

for index, row in df.iterrows():
    print(row['c1'], row['c2'])

Output: 
   10 100
   11 110
   12 120

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

3
@ viddik13 এটি একটি দুর্দান্ত নোট ধন্যবাদ। তার কারণেই আমি এমন একটি মামলায় ছড়িয়ে 431341610650পড়েছি যেখানে সংখ্যার মান যেখানে পড়তে হবে 4.31E+11। টাইপগুলি সংরক্ষণের জন্য কি কোনও উপায় আছে?
আজিজ আল্টো

26
itertuplesনিচে বর্ণিত হিসাবে @ আজিজআল্টো ব্যবহার করুন । এছাড়াও পান্ডাস.পিডিটা.অর্গ
এক্সেল

100
ইটরোজ ব্যবহার করবেন না। Itertuples দ্রুত এবং ডেটা প্রকার সংরক্ষণ করে। আরও তথ্য
জেমস এল।

11
ডকুমেন্টেশন থেকে : "পান্ডাস বস্তুগুলির মাধ্যমে আইট্রেট করা সাধারণত ধীর হয় many আপনার উত্তরটি সঠিক (প্রশ্নের প্রসঙ্গে) তবে এর কোথাও উল্লেখ নেই, সুতরাং এটি খুব ভাল উত্তর নয়।
cs95

448

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

উত্তরঃ না DO * !

পান্ডাসে আইট্রেটেশন একটি অ্যান্টি-প্যাটার্ন এবং এটি এমন কিছু যা কেবল তখনই আপনার করা উচিত যখন আপনি প্রতিটি অন্যান্য বিকল্প নিঃশেষ করে দেন। iterকয়েক হাজারেরও বেশি সারি এর জন্য আপনার নামে " " কোনও ফাংশন ব্যবহার করা উচিত নয় বা আপনাকে প্রচুর অপেক্ষায় অভ্যস্ত হতে হবে।

আপনি কি ডেটা ফ্রেম মুদ্রণ করতে চান? ব্যবহার DataFrame.to_string()

আপনি কি কিছু গণনা করতে চান? সেক্ষেত্রে এই ক্রমে পদ্ধতিগুলির জন্য অনুসন্ধান করুন (তালিকাটি এখান থেকে সংশোধিত হয়েছে ):

  1. Vectorization
  2. সিথনের রুটিনগুলি
  3. তালিকা সমঝোতা (ভ্যানিলা forলুপ)
  4. DataFrame.apply(): i) সিথনে সঞ্চালনযোগ্য হ্রাস, ii) পাইথন স্পেসে আইট্রেশন
  5. DataFrame.itertuples() এবং iteritems()
  6. DataFrame.iterrows()

iterrowsএবং itertuples(এই প্রশ্নের উত্তরে উভয়ই অনেক ভোট গ্রহণ করে) অত্যন্ত বিরল পরিস্থিতিতে যেমন ক্রমযুক্ত প্রসেসিংয়ের জন্য সারি বস্তু / নেমটুপলস তৈরি করা উচিত যা এই ফাংশনগুলির জন্য সত্যই কার্যকর thing

কর্তৃপক্ষের কাছে আবেদন - পুনরাবৃত্তির
ডক্স পৃষ্ঠায় একটি বিশাল লাল সতর্কতা বাক্স রয়েছে যা বলে:

পান্ডাস বস্তুর মাধ্যমে আইট্রেট করা সাধারণত ধীর হয়। অনেক ক্ষেত্রে সারিগুলির উপরে ম্যানুয়ালি পুনরাবৃত্তি করার প্রয়োজন হয় না [...]।

* এটি আসলে "না" এর চেয়ে কিছুটা জটিল। df.iterrows()এই প্রশ্নের সঠিক উত্তর, তবে "আপনার অপ্টকে ভেক্টরাইজ করুন" আরও ভাল। আমি স্বীকার করব যে এমন পরিস্থিতিতে রয়েছে যেখানে পুনরাবৃত্তি এড়ানো যায় না (উদাহরণস্বরূপ, কিছু অপারেশন যেখানে ফলাফলটি পূর্ববর্তী সারির জন্য গুণিত মানের উপর নির্ভর করে)। তবে কখন তা জানতে গ্রন্থাগারের সাথে কিছুটা পরিচিতি লাগে। আপনার যদি পুনরাবৃত্তি সমাধান প্রয়োজন কিনা তা নিশ্চিত না হন তবে আপনি সম্ভবত তা করবেন না। পিএস: এই উত্তরটি লেখার জন্য আমার যুক্তি সম্পর্কে আরও জানতে, নীচের দিকে যান।


লুপিংয়ের চেয়ে দ্রুত: ভেক্টরাইজেশন , সিথন

বেশ কয়েকটি বেসিক ক্রিয়াকলাপ এবং গণনাগুলি পান্ডাস দ্বারা "ভেক্টরাইজড" হয় (হয় নুমপি বা সিথোনাইজড ফাংশনগুলির মাধ্যমে)। এর মধ্যে রয়েছে গাণিতিক, তুলনা, (সর্বাধিক) হ্রাস, পুনরায় আকার নির্ধারণ (যেমন পিভোটিং), যোগ দেয় এবং গোষ্ঠীবদ্ধ ক্রিয়াকলাপ includes আপনার সমস্যার জন্য উপযুক্ত ভেক্টরাইজড পদ্ধতিটি খুঁজতে প্রয়োজনীয় বুনিয়াদি কার্যকারিতা সম্পর্কিত ডকুমেন্টেশনটি দেখুন ।

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


পরবর্তী সেরা জিনিস: তালিকা সমঝোতা *

তালিকা অনুধাবনগুলি আপনার পরবর্তী কলের পোর্ট হওয়া উচিত যদি 1) কোনও ভেক্টরাইজড সমাধান পাওয়া যায় না, 2) পারফরম্যান্স গুরুত্বপূর্ণ, তবে আপনার কোডটি সাইথোনাইজিংয়ের ঝামেলার মধ্য দিয়ে যাওয়ার পক্ষে যথেষ্ট গুরুত্বপূর্ণ নয়, এবং 3) আপনি এলিমিনাইজ ট্রান্সফর্মেশন সম্পাদনের চেষ্টা করছেন আপনার কোডে একটা হল প্রমাণ ভাল পরিমাণ সুপারিশ সেই তালিকাটি comprehensions পর্যাপ্ত ফাস্ট (এবং এমনকি কখনও কখনও দ্রুত) অনেক সাধারণ পান্ডাস কাজের জন্য হয়।

সূত্রটি সহজ,

# iterating over one column - `f` is some function that processes your data
result = [f(x) for x in df['col']]
# iterating over two columns, use `zip`
result = [f(x, y) for x, y in zip(df['col1'], df['col2'])]
# iterating over multiple columns - same data type
result = [f(row[0], ..., row[n]) for row in df[['col1', ...,'coln']].to_numpy()]
# iterating over multiple columns - differing data type
result = [f(row[0], ..., row[n]) for row in zip(df['col1'], ..., df['coln'])]

আপনি যদি আপনার ব্যবসায়িক যুক্তি কোনও ফাংশনে আবদ্ধ করতে পারেন তবে আপনি একটি তালিকা বোঝার জন্য এটি কল করতে পারেন। কাঁচা অজগরটির সরলতা এবং গতির মধ্য দিয়ে আপনি নির্বিচারে জটিল জিনিসগুলি কাজ করতে পারেন।

ক্যাভেটস
তালিকা অনুধাবনগুলি ধরে নিয়েছে যে আপনার ডেটা সাথে কাজ করা সহজ - এর অর্থ কী যা আপনার ডেটা ধরণের এবং সামঞ্জস্যপূর্ণ এবং আপনার এনএএন নেই, তবে এটি সর্বদা গ্যারান্টিযুক্ত হতে পারে না।

  1. প্রথমটি আরও সুস্পষ্ট, তবে এনএএনদের সাথে কথা বলার সময়, অন্তর্নির্মিত পান্ডা পদ্ধতিগুলি উপস্থিত থাকলে তাদের পছন্দ করুন (কারণ তাদের কাছে কোণার-কেস পরিচালনা করার লজিক রয়েছে), অথবা আপনার ব্যবসায়িক যুক্তিতে উপযুক্ত NaN হ্যান্ডলিং যুক্তি অন্তর্ভুক্ত রয়েছে তা নিশ্চিত করুন।
  2. মিশ্র ডেটা প্রকারের সাথে ডিল করার সময় আপনার উত্তরটির zip(df['A'], df['B'], ...)পরিবর্তে পুনরাবৃত্তি করা উচিত df[['A', 'B']].to_numpy()কারণ পরেরটি সুস্পষ্টভাবে সবচেয়ে সাধারণ ধরণের ডেটা আপকাস্ট করে। উদাহরণ হিসাবে যদি A সংখ্যাসূচক হয় এবং B স্ট্রিং হয় to_numpy()তবে পুরো অ্যারেটিকে স্ট্রিংয়ে ফেলে দেবে, যা আপনি চান তা নাও হতে পারে। ভাগ্যক্রমে zipআপনার কলামগুলির একসাথে পিং করা এটির পক্ষে সবচেয়ে সহজ কাজ।

* উপরের ক্যাভেটস বিভাগে বর্ণিত কারণগুলির জন্য ওয়াইএমএমভি


একটি স্পষ্ট উদাহরণ

আসুন দুটি পান্ডাস কলাম যুক্ত করার একটি সাধারণ উদাহরণ দিয়ে পার্থক্যটি দেখান A + B। এটি একটি ভেক্টরাইজযোগ্য অপারেটন, সুতরাং উপরে বর্ণিত পদ্ধতিগুলির পারফরম্যান্সের বিপরীতে কাজ করা সহজ হবে।

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

আপনার রেফারেন্সের জন্য বেঞ্চমার্কিং কোড।

আমার অবশ্য উল্লেখ করা উচিত যে এটি সর্বদা এই কাটা এবং শুকনো হয় না। কখনও কখনও "অপারেশনের সর্বোত্তম পদ্ধতি কী" এর উত্তর "এটি আপনার ডেটার উপর নির্ভর করে"। আমার পরামর্শ হ'ল কোনওটিতে স্থির হওয়ার আগে আপনার ডেটা সম্পর্কে বিভিন্ন পদ্ধতির পরীক্ষা করা।


আরও পড়া

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


আমি কেন এই উত্তরটি লিখেছি

নতুন ব্যবহারকারীর কাছ থেকে আমি একটি সাধারণ প্রবণতা লক্ষ্য করি তা হল "আমি কীভাবে আমার ডিএফ দিয়ে এক্স করতে পারি?" ফর্মটির প্রশ্ন জিজ্ঞাসা করা। iterrows()লুপের জন্য কিছু করার সময় যে কোডগুলি কল করে তা দেখানো হচ্ছে । এখানে কেন। গ্রন্থাগারের একজন নতুন ব্যবহারকারী যিনি ভেক্টরাইজেশন ধারণার সাথে পরিচিত হননি তারা সম্ভবত কোডটি কল্পনা করবে যা তাদের সমস্যাটি সমাধান করে যেহেতু কিছু করার জন্য তাদের ডেটা নিয়ে পুনরাবৃত্তি করে as কোনও ডেটাফ্রেমের মাধ্যমে কীভাবে পুনরাবৃত্তি করা যায় তা না জানা, তারা প্রথম কাজটি গুগল করে এবং এই প্রশ্নে এখানেই শেষ হয়। তারপরে তারা গ্রহণযোগ্য উত্তর তাদের কীভাবে বলবে তা দেখেন এবং তারা চোখ বন্ধ করে এবং পুনরাবৃত্তিটি সঠিকভাবে করা ঠিক না যদি কোনও প্রশ্ন না করে এই কোড চালায় run

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


21
এই একমাত্র উত্তর যা পান্ডার সাথে ব্যবহার করা উচিত এমন মূর্তিযুক্ত কৌশলগুলিকে কেন্দ্র করে, এটিকে এই প্রশ্নের সেরা উত্তর করে। সঠিক কোড দিয়ে সঠিক উত্তর পেতে শেখা ( ভুল কোডের সাথে সঠিক উত্তরের পরিবর্তে - অর্থাত্ অদক্ষ, স্কেল হয় না, নির্দিষ্ট ডেটার সাথে খুব বেশি ফিট হয় না) পাণ্ডা শেখার একটি বড় অংশ (এবং সাধারণভাবে ডেটা)।
লিংকব্রেস্ট

3
আমি মনে করি আপনি লুপের প্রতি অন্যায় করছেন, যদিও তারা আমার পরীক্ষাগুলিতে তালিকা বোধগমণের চেয়ে কিছুটা ধীর গতিতে দেখছেন। কৌতুক উপর লুপ হয় zip(df['A'], df['B'])পরিবর্তে df.iterrows()
অনিবার্য রাত

2
পছন্দ করুন এই পোস্টের বিন্দুটি সাধারণভাবে পুনরাবৃত্তিকে অস্বীকার করা নয় - এটি নির্দিষ্টভাবে ব্যবহারের নিন্দা করা iterrows(), এবং আরও ভাল বিকল্পের উপস্থিতি থাকলে এবং স্পষ্টতই পুনরাবৃত্তিটি নিন্দা করা। forলুপগুলি তাদের নিজের কাছে ঠিক আছে, তবে তালিকার বোধগম্যতা যদি আপনি পুনরুক্তি করে উপাদান অনুসারে পরিবর্তনগুলি সম্পাদন করে থাকেন তবে আরও ভাল।
cs95

1
@ এসডিবিবিএস রয়েছে, আপনার ডেটা বাছাই করতে सॉर्ट_ভ্যালুগুলি ব্যবহার করুন, তারপরে ফলাফলটিতে to_string () এ কল করুন।
cs95

1
তালিকা সমঝোতার অধীনে, "একাধিক কলামের উপরে পুনরাবৃত্তি" উদাহরণের জন্য একটি সতর্কতা দরকার: DataFrame.valuesপ্রতিটি কলামকে একটি সাধারণ ডেটা ধরণে রূপান্তরিত করে। DataFrame.to_numpy()এটিও করে ভাগ্যক্রমে আমরা যে zipকোনও কলামের সংখ্যার সাহায্যে ব্যবহার করতে পারি ।
ডেভিড ওয়াসারম্যান

396

আপনার যদি ডেটা ফ্রেমের সারিগুলিতে সত্যিই পুনরাবৃত্তি করতে হয় তবে প্রথমে বিবেচনা করুন । বিকল্পগুলির জন্য এই উত্তরটি দেখুন ।

আপনার যদি এখনও সারিগুলিতে পুনরাবৃত্তি করতে হয় তবে আপনি নীচের পদ্ধতিগুলি ব্যবহার করতে পারেন। কিছু গুরুত্বপূর্ণ সতর্কতা নোট করুন যা অন্য কোনও উত্তরে উল্লেখ করা হয়নি।

itertuples() এর চেয়ে দ্রুত হওয়ার কথা iterrows()

তবে ডক্স অনুসারে সচেতন হোন (এই মুহুর্তে 0.24.2 প্যান্ডাস):

  • iterrows: dtypeসারি থেকে সারি মিলবে না

    যেহেতু আইটারোস প্রতিটি সারির জন্য একটি সিরিজ দেয় , এটি সারিগুলিতে ডাইপগুলি সংরক্ষণ করে না (ডাটাফ্রেমগুলির জন্য কলামগুলিতে ডাইপগুলি সংরক্ষণ করা হয়)। সারিগুলিতে পুনরাবৃত্তি করার সময় ধরণের টাইপগুলি সংরক্ষণ করার জন্য, এটির ব্যবহারশক্তি ব্যবহার করা ভাল () যা মানগুলির নাম তালিকাকে দেয় এবং যা সাধারণত ইরেরো () এর চেয়ে অনেক দ্রুত হয়

  • iterrows: সারিগুলি সংশোধন করবেন না

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

    ব্যবহারের DataFrame.apply () পরিবর্তে:

    new_df = df.apply(lambda x: x * 2)
  • itertuples:

    কলামের নামগুলি স্থায়ী নামগুলিতে পুনরায় নামকরণ করা হবে যদি তারা অবৈধ পাইথন সনাক্তকারী হয়, পুনরাবৃত্তি হয় বা আন্ডারস্কোর দিয়ে শুরু করে। বিপুল সংখ্যক কলাম (> 255) সহ, নিয়মিত টিপলগুলি ফেরত দেওয়া হয়।

আরও বিশদের জন্য পুনরাবৃত্তিতে পান্ডাস ডক্স দেখুন ।


4
এই থ্রেডটি শেষ হওয়ার পরে এতক্ষণ পড়ে কারও কাছ থেকে কেবল একটি ছোট্ট প্রশ্ন: df.apply () দক্ষতার ক্ষেত্রে কীভাবে ইটার্টুপলসের সাথে তুলনা করে?
রাউল গুয়ারিনি

4
দ্রষ্টব্য: আপনি for row in df[['c1','c2']].itertuples(index=True, name=None):সারি পুনরাবৃত্তকারীগুলিতে কেবলমাত্র নির্দিষ্ট কলামগুলি অন্তর্ভুক্ত করার মতো কিছু বলতে পারেন ।
ব্রায়ান বার্নস

12
পরিবর্তে getattr(row, "c1"), আপনি কেবল ব্যবহার করতে পারেন row.c1
ভাইরাপটার

1
আমি প্রায় 90% নিশ্চিত যে আপনি যদি এর getattr(row, "c1")পরিবর্তে ব্যবহার করেন তবে আপনি row.c1কোনও কার্যকারিতা সুবিধা হারাতে itertuplesপারেন এবং যদি আপনাকে আসলে স্ট্রিংয়ের মাধ্যমে সম্পত্তিটি পেতে প্রয়োজন হয় তবে আপনার পরিবর্তে এটিটি ব্যবহার করা উচিত।
নোট্টিফোবিয়া

3
আমি এই প্রশ্নে হোঁচট খেয়েছি কারণ, যদিও আমি জানতাম যে বিভক্ত-প্রয়োগ- সংযুক্তি রয়েছে , তবুও আমার এখনও একটি ডেটা ফ্রেমের উপর পুনরাবৃত্তি করতে হবে (যেমন প্রশ্ন রয়েছে)। প্রত্যেকেরই উন্নতি করার বিলাসিতা থাকে না numbaএবং cython(একই ডক্সে বলে যে "পাইথনে এটি সর্বদা অনুকূল করা উপযুক্ত")। আমি এই উত্তরটি অন্যদের এই সমস্যাগুলি এড়াতে (কখনও কখনও হতাশাব্যঞ্জক) এড়াতে সহায়তা করার জন্য লিখেছিলাম কারণ অন্য উত্তরের কোনও উত্তরই এই সাবধানতার কথা উল্লেখ করে না। কাউকে বিভ্রান্ত করা বা "এটিই সঠিক জিনিস" বলা কখনই আমার উদ্দেশ্য ছিল না। আমি উত্তর উন্নতি করেছি।
viddik13

201

আপনার ব্যবহার করা উচিত df.iterrows()। যদিও সারি-সারি সারি পুনরাবৃত্তি করা বিশেষভাবে কার্যকর নয় যেহেতু Seriesবস্তুগুলি তৈরি করতে হয়।


12
এটি কি ডেটাফ্রেমকে একটি নিম্পি অ্যারে (.values ​​এর মাধ্যমে) রূপান্তর করা এবং অ্যারেতে সরাসরি অপারেটিংয়ের চেয়ে দ্রুত? আমারও একই সমস্যা আছে তবে শেষ হয়ে গেছে একটি নাম্পার অ্যারেতে রূপান্তর করা এবং তারপরে সিথন ব্যবহার করা।
vgoklani

12
@vgoklani যদি সারি-সারি সারিটি পুনরাবৃত্তিটি অকার্যকর হয় এবং আপনার কোনও অ-অবজেক্ট নম্পি অ্যারে থাকে তবে প্রায় অবশ্যই কাঁচা নিম্পি অ্যারে ব্যবহার করা দ্রুততর হবে, বিশেষত বহু সারিযুক্ত অ্যারেগুলির জন্য।
ফিলিপ ক্লাউড

7
আমি df.iterrows (), df.itertuples (), এবং জিপ (df ['a'], df ['b']) এর জন্য সময় সাপেক্ষে কিছুটা পরীক্ষা করেছি এবং ফলাফল অন্যটির উত্তরে পোস্ট করেছি প্রশ্ন: স্ট্যাকওভারফ্লো.com
রিচার্ড ওয়াং

154

যদিও iterrows()এটি একটি ভাল বিকল্প, কখনও কখনও itertuples()খুব দ্রুত হতে পারে:

df = pd.DataFrame({'a': randn(1000), 'b': randn(1000),'N': randint(100, 1000, (1000)), 'x': 'x'})

%timeit [row.a * 2 for idx, row in df.iterrows()]
# => 10 loops, best of 3: 50.3 ms per loop

%timeit [row[1] * 2 for row in df.itertuples()]
# => 1000 loops, best of 3: 541 µs per loop

5
আপনার দুটি উদাহরণের বেশিরভাগ সময়ের পার্থক্য দেখে মনে হচ্ছে এটি হ'ল আপনি। অঙ্কিত কমান্ডের জন্য .itetuples () কমান্ডের জন্য লেবেল-ভিত্তিক সূচক এবং পূর্ণসংখ্যার ভিত্তিক সূচক ব্যবহার করছেন বলে মনে হয়েছে।
অ্যালেক্স

2
ফিনান্স ডেটা ভিত্তিক ডেটাফ্রেম (টাইমস্ট্যাম্প এবং 4 এক্স ফ্ল্যাট) এর জন্য, আমার মেশিনে ইটাররোপগুলি তারপরে 19,57 গুণ বেশি দ্রুত হয়। শুধুমাত্র for a,b,c in izip(df["a"],df["b"],df["c"]:প্রায় সমান দ্রুত।
harbun

7
কেন আপনি দ্রুত ব্যাখ্যা করতে পারেন?
আবে মিজস্লার

4
@AbeMiessler iterrows()প্রতিটি সারি ডেটা একটি সিরিজে বক্স করে, যেখানে itertuples()নেই।
মিরাদুলো

3
মনে রাখবেন যে কলামগুলির ক্রমটি আসলে অনির্ধারিত, কারণ dfএকটি অভিধান থেকে তৈরি করা হয়েছে, সুতরাং row[1]কলামগুলির কোনওটিকেই উল্লেখ করতে পারে। যেমনটি দেখা যাচ্ছে যদিও সময়গুলি প্রায়শই একই রকম ভাসমান কলাম বনাম পূর্ণসংখ্যার জন্য।
ব্রায়ান বার্নস

88

আপনি df.apply()সারিগুলিতে পুনরাবৃত্তি করতে এবং কোনও ফাংশনের জন্য একাধিক কলামগুলি অ্যাক্সেস করতেও ব্যবহার করতে পারেন ।

ডক্স: ডেটাফ্রেম.প্লাই ()

def valuation_formula(x, y):
    return x * y * 0.5

df['price'] = df.apply(lambda row: valuation_formula(row['x'], row['y']), axis=1)

ডিএফ ['দাম'] কি ডেটা ফ্রেমের কোনও কলামের নাম বোঝায়? আমি একটি সিএসভি ফাইলে বিভিন্ন কলাম থেকে অনন্য মান সহ একটি অভিধান তৈরি করার চেষ্টা করছি। আমি আপনার যুক্তিটি অনন্য কী এবং মানগুলির সাথে একটি অভিধান তৈরি করতে ব্যবহার করেছি এবং টাইপএরারকে
এসআরএস

কোড: ডিএফ ['ওয়ার্কক্লাস'] = df.apply (ল্যাম্বডা সারি: dic_update (সারি), অক্ষ = 1) লাইন আইডি = 0 লাইন ডিফ dic_update এর শেষ (সারি): সারি যদি dic না থাকে: dic [সারি] = আইডি আইডি = আইডি + 1
এসআরএস

কিছু মনে করবেন না, আমি এটি পেয়েছি। ফাংশন কল লাইনটি df_new = df ['ওয়ার্কক্লাস'] এ পরিবর্তন করেছে apply প্রয়োগ করুন (একই জিনিস)
এসআরএস

2
অক্ষটি 0 তে থাকা সবচেয়ে খারাপ
zthomas.nc

9
লক্ষ্য করুন যে applyসারিগুলির উপরে "পুনরাবৃত্তি" হয় না, এটি সারি অনুসারে একটি ফাংশন প্রয়োগ করে। উপরের কোডটি যদি আপনার সত্যিকারের পুনরাবৃত্তি এবং অশ্লীল প্রয়োজন হয় না , উদাহরণস্বরূপ যখন বিভিন্ন সারিতে মূল্যগুলির তুলনা করা হয় ( সেক্ষেত্রে আপনি পুনরাবৃত্তি ছাড়া কিছুই করতে পারবেন না)।
জেন্ট করা হয়েছে

82

আপনি নিম্নলিখিত হিসাবে df.iloc ফাংশন ব্যবহার করতে পারেন:

for i in range(0, len(df)):
    print df.iloc[i]['c1'], df.iloc[i]['c2']

1
আমি জানি যে এটির এয়ারো বা ইটারটোপলসের পক্ষে এটি এড়ানো উচিত, তবে কেন তা জেনে রাখা আকর্ষণীয় হবে। কোন চিন্তা?
rocarvaj

12
আপনি যদি ডেটা প্রকারগুলি সংরক্ষণ করতে চান এবং নাম অনুসারে কলামগুলিও উল্লেখ করতে চান তবে আমি জানতে পারি এটিই একমাত্র বৈধ কৌশল। itertuplesডেটা প্রকারগুলি সংরক্ষণ করে তবে এটি পছন্দ করে না এমন কোনও নাম থেকে মুক্তি পায়। iterrowsবিপরীত না।
কেন উইলিয়ামস

6
সাধারণ এবং অভিব্যক্তিপূর্ণ কিছু করার জন্য পান্ডাস ডেটা স্ট্রাকচারের আইডিসিয়েন্সির মাধ্যমে বিস্মৃত হওয়ার চেষ্টা করতে ঘন্টা সময় ব্যয় করেছে। এটি পঠনযোগ্য কোডে ফলাফল।
সান অ্যান্ডারসন

যদিও for i in range(df.shape[0])এই পদ্ধতিরটি কিছুটা গতি বাড়িয়ে তুলতে পারে, এটি এখনও আমার অ্যাপ্লিকেশনটির জন্য উপরের আইটারো () পদ্ধতির চেয়ে প্রায় 3.5x কম slow
কিম মিলার

বড় ডেটাফ্রেমে এটি আরও ভাল মনে হয় কারণ my_iter = df.itertuples()দ্বিগুণ মেমরি এবং এটি অনুলিপি করতে অনেক সময় লাগে। একই জন্য iterrows()
বাসটিয়ান

33

আমি সারি এবং কলামগুলিতে কীভাবে পুনরাবৃত্তি করব তা সন্ধান করছিলাম এবং এখানেই শেষ হয়েছিল:

for i, row in df.iterrows():
    for j, column in row.iteritems():
        print(column)

18

আপনি প্রয়োগ করতে পারেন যে আপনার নিজের পুনরুক্তি লিখতে পারেন namedtuple

from collections import namedtuple

def myiter(d, cols=None):
    if cols is None:
        v = d.values.tolist()
        cols = d.columns.values.tolist()
    else:
        j = [d.columns.get_loc(c) for c in cols]
        v = d.values[:, j].tolist()

    n = namedtuple('MyTuple', cols)

    for line in iter(v):
        yield n(*line)

এটি সরাসরি তুলনাযোগ্য pd.DataFrame.itertuples। আমি আরও দক্ষতার সাথে একই কাজ সম্পাদনের লক্ষ্য করছি।


আমার ফাংশন সহ প্রদত্ত ডেটাফ্রেমের জন্য:

list(myiter(df))

[MyTuple(c1=10, c2=100), MyTuple(c1=11, c2=110), MyTuple(c1=12, c2=120)]

বা সাথে pd.DataFrame.itertuples:

list(df.itertuples(index=False))

[Pandas(c1=10, c2=100), Pandas(c1=11, c2=110), Pandas(c1=12, c2=120)]

একটি বিস্তৃত পরীক্ষা
আমরা সমস্ত কলাম উপলব্ধ করে এবং কলামগুলি সাবসেট করে তুলছি test

def iterfullA(d):
    return list(myiter(d))

def iterfullB(d):
    return list(d.itertuples(index=False))

def itersubA(d):
    return list(myiter(d, ['col3', 'col4', 'col5', 'col6', 'col7']))

def itersubB(d):
    return list(d[['col3', 'col4', 'col5', 'col6', 'col7']].itertuples(index=False))

res = pd.DataFrame(
    index=[10, 30, 100, 300, 1000, 3000, 10000, 30000],
    columns='iterfullA iterfullB itersubA itersubB'.split(),
    dtype=float
)

for i in res.index:
    d = pd.DataFrame(np.random.randint(10, size=(i, 10))).add_prefix('col')
    for j in res.columns:
        stmt = '{}(d)'.format(j)
        setp = 'from __main__ import d, {}'.format(j)
        res.at[i, j] = timeit(stmt, setp, number=100)

res.groupby(res.columns.str[4:-1], axis=1).plot(loglog=True);

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

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


2
কোডটি পড়তে চান না এমন লোকেদের জন্য: নীল রেখাটি হল intertuples, কমলা রেখাটি একটি ফলন ব্লকের মাধ্যমে একটি পুনরাবৃত্তির একটি তালিকা। interrowsতুলনা করা হয় না।
জেমস এল।

18

দক্ষতার সাথে পুনরাবৃত্তি কিভাবে?

যদি আপনাকে সত্যই কোনও পান্ডাস ডেটা ফ্রেমটি পুনরায় করতে হয়, আপনি সম্ভবত এটিরোজ () ব্যবহার এড়াতে চাইবেন । বিভিন্ন পদ্ধতি আছে এবং সাধারণটি iterrows()সেরা হওয়া থেকে অনেক দূরে। itertuples () 100 গুণ দ্রুত হতে পারে।

সংক্ষেপে:

  • একটি সাধারণ নিয়ম হিসাবে, ব্যবহার করুন df.itertuples(name=None)। বিশেষত, যখন আপনার কাছে একটি নির্দিষ্ট নম্বর কলাম এবং 255 এরও কম কলাম থাকে। পয়েন্ট দেখুন (3)
  • অন্যথায়, df.itertuples()আপনার কলামগুলিতে স্পেস বা '-' এর মতো বিশেষ অক্ষর রয়েছে তা ব্যতীত ব্যবহার করুন । পয়েন্ট দেখুন (2)
  • itertuples()আপনার ডেটাফ্রেমের শেষ উদাহরণ ব্যবহার করে অদ্ভুত কলামগুলি থাকলেও এটি ব্যবহার করা সম্ভব । পয়েন্ট দেখুন (4)
  • iterrows()আপনি যদি পূর্ববর্তী সমাধানগুলি না করতে পারেন তবেই ব্যবহার করুন । পয়েন্ট দেখুন (1)

পান্ডাস ডেটাফ্রেমে সারিগুলিতে পুনরাবৃত্তি করার জন্য বিভিন্ন পদ্ধতি:

মিলিয়ন সারি এবং 4 টি কলাম সহ একটি এলোমেলো ডাটাফ্রেম তৈরি করুন:

    df = pd.DataFrame(np.random.randint(0, 100, size=(1000000, 4)), columns=list('ABCD'))
    print(df)

1) স্বাভাবিকটি iterrows()সুবিধাজনক তবে ধীর গতিতে:

start_time = time.clock()
result = 0
for _, row in df.iterrows():
    result += max(row['B'], row['C'])

total_elapsed_time = round(time.clock() - start_time, 2)
print("1. Iterrows done in {} seconds, result = {}".format(total_elapsed_time, result))

২) ডিফল্টটি itertuples()ইতিমধ্যে আরও দ্রুততর তবে এটি কলামের নামগুলির সাথে কাজ করে না My Col-Name is very Strange( যেমন আপনার কলামগুলি পুনরাবৃত্তি করা হয় বা কোনও কলামের নামটি কেবল পাইথন ভেরিয়েবল নামে রূপান্তর করতে না পারলে আপনার এই পদ্ধতিটি এড়ানো উচিত): .:

start_time = time.clock()
result = 0
for row in df.itertuples(index=False):
    result += max(row.B, row.C)

total_elapsed_time = round(time.clock() - start_time, 2)
print("2. Named Itertuples done in {} seconds, result = {}".format(total_elapsed_time, result))

3) itertuples()নাম = কোনওটি ব্যবহার করে ডিফল্টটি আরও দ্রুততর তবে সত্যই সুবিধাজনক নয় কারণ আপনাকে প্রতি কলামে একটি ভেরিয়েবল নির্ধারণ করতে হবে।

start_time = time.clock()
result = 0
for(_, col1, col2, col3, col4) in df.itertuples(name=None):
    result += max(col2, col3)

total_elapsed_time = round(time.clock() - start_time, 2)
print("3. Itertuples done in {} seconds, result = {}".format(total_elapsed_time, result))

৪) অবশেষে, নামটি itertuples()পূর্বের পয়েন্টের তুলনায় ধীর হয় তবে আপনাকে প্রতি কলামে একটি ভেরিয়েবল নির্ধারণ করতে হবে না এবং এটি কলামের নামের সাথে যেমন কাজ করে My Col-Name is very Strange

start_time = time.clock()
result = 0
for row in df.itertuples(index=False):
    result += max(row[df.columns.get_loc('B')], row[df.columns.get_loc('C')])

total_elapsed_time = round(time.clock() - start_time, 2)
print("4. Polyvalent Itertuples working even with special characters in the column name done in {} seconds, result = {}".format(total_elapsed_time, result))

আউটপুট:

         A   B   C   D
0       41  63  42  23
1       54   9  24  65
2       15  34  10   9
3       39  94  82  97
4        4  88  79  54
...     ..  ..  ..  ..
999995  48  27   4  25
999996  16  51  34  28
999997   1  39  61  14
999998  66  51  27  70
999999  51  53  47  99

[1000000 rows x 4 columns]

1. Iterrows done in 104.96 seconds, result = 66151519
2. Named Itertuples done in 1.26 seconds, result = 66151519
3. Itertuples done in 0.94 seconds, result = 66151519
4. Polyvalent Itertuples working even with special characters in the column name done in 2.94 seconds, result = 66151519

এই নিবন্ধটি iterrow এবং itertuples মধ্যে একটি খুব আকর্ষণীয় তুলনা


14

একটিতে সমস্ত সারি লুপ dataframeকরতে আপনি ব্যবহার করতে পারেন:

for x in range(len(date_example.index)):
    print date_example['Date'].iloc[x]

1
এটি শৃঙ্খলিত শৃঙ্খলাবদ্ধ। আমি এটি করার পরামর্শ দিচ্ছি না।
cs95

@ cs95 এর পরিবর্তে আপনি কী প্রস্তাব করবেন?
CONvid19

আপনি যদি এই কাজটি করতে চান তবে তারিখের কলামের (লুপের বাইরে) পূর্ণসংখ্যার সূচক অবস্থানটি পেতে df.columns.get_loc কল করুন, তারপরে ভিতরে একটি একক iloc সূচক কলটি ব্যবহার করুন।
cs95

14
 for ind in df.index:
     print df['c1'][ind], df['c2'][ind]

1
বৃহত ডেটাফ্রেমে (উদাহরণস্বরূপ লক্ষ লক্ষ সারি) ব্যবহার করার সময় এই বিকল্পটির কার্যকারিতা কীভাবে হয়?
বাজলি দেবোস্কি

সত্য, আমি ঠিক জানি না, আমি মনে করি যে সেরা উত্তরের সাথে তুলনা করলে, অতিবাহিত সময় একই রকম হবে, কারণ উভয় ক্ষেত্রেই "কনস্ট্রাকশন" ব্যবহার করা হয়। তবে স্মৃতি কিছু ক্ষেত্রে আলাদা হতে পারে।
গ্রেগ2015

4
এটি শৃঙ্খলিত শৃঙ্খলাবদ্ধ। এটি ব্যবহার করবেন না!
cs95

7

কখনও কখনও দরকারী প্যাটার্নটি হ'ল:

# Borrowing @KutalmisB df example
df = pd.DataFrame({'col1': [1, 2], 'col2': [0.1, 0.2]}, index=['a', 'b'])
# The to_dict call results in a list of dicts
# where each row_dict is a dictionary with k:v pairs of columns:value for that row
for row_dict in df.to_dict(orient='records'):
    print(row_dict)

যার ফলাফল:

{'col1':1.0, 'col2':0.1}
{'col1':2.0, 'col2':0.2}

6

একটিতে সমস্ত সারি লুপ করতে dataframeএবং প্রতিটি সারির মানগুলি সুবিধামত ব্যবহার করতে , এসগুলিতে রূপান্তর করা যায় । উদাহরণ স্বরূপ:namedtuplesndarray

df = pd.DataFrame({'col1': [1, 2], 'col2': [0.1, 0.2]}, index=['a', 'b'])

সারিগুলির উপরে আইট্রেট করা:

for row in df.itertuples(index=False, name='Pandas'):
    print np.asarray(row)

ফলাফল স্বরূপ:

[ 1.   0.1]
[ 2.   0.2]

দয়া করে মনে রাখবেন যে index=True, সূচিটি টিউপলের প্রথম উপাদান হিসাবে যুক্ত করা হয়েছে যা কিছু অ্যাপ্লিকেশনের জন্য অনাকাঙ্ক্ষিত হতে পারে।


5

বিনিময়ে ডেটাফ্রেম পাওয়ার সময় নিক্ষেপ সারিগুলিকে পুনরাবৃত্তি করার একটি উপায় রয়েছে এবং কোনও সিরিজ নয়। সারিটি ডেটাফ্রেম হিসাবে ফিরিয়ে দেওয়ার জন্য আপনি তালিকা অনুসারে সূচী পাস করতে পারেন এমন উল্লেখ করে আমি কাউকে দেখতে পাচ্ছি না:

for i in range(len(df)):
    row = df.iloc[[i]]

ডাবল বন্ধনী ব্যবহার নোট করুন। এটি একটি একক সারি সহ একটি ডেটাফ্রেম দেয়।


এটি বাছাইয়ের পরে ডেটা ফ্রেমে নবমতম সারি পাওয়ার জন্য খুব সহায়ক ছিল। ধন্যবাদ!
জেসন হ্যারিসন

3

উভয় দেখতে এবং মান পরিবর্তন করার জন্য, আমি ব্যবহার করব iterrows()। লুপের জন্য এবং টুপল আনপ্যাকিং ব্যবহার করে (উদাহরণটি দেখুন i, row:) আমি মানগুলি rowদেখার জন্য এবং আমি যখন মানগুলি পরিবর্তন করতে চাই তখন পদ্ধতিটির iসাথে ব্যবহার locকরি। পূর্ববর্তী উত্তরে যেমন বলা হয়েছে, এখানে আপনার পুনরাবৃত্তি হচ্ছে এমন কিছু পরিবর্তন করা উচিত নয়।

for i, row in df.iterrows():
    df_column_A = df.loc[i, 'A']
    if df_column_A == 'Old_Value':
        df_column_A = 'New_value'  

এখানে rowলুপের মধ্যে থাকা সেই সারিটির একটি অনুলিপি রয়েছে এবং এটির কোনও ভিউ নয়। অতএব, আপনার মতো কিছু লেখা উচিত নয় row['A'] = 'New_Value', এটি ডেটা ফ্রেমটি পরিবর্তন করবে না। তবে, আপনি কাজটি করতে ডেটাফ্রেমটি ব্যবহার iএবং locনির্দিষ্ট করতে পারেন ।


2

আমি জানি যে আমি উত্তর দেওয়ার দেরিতে দেরি করেছি, তবে আমি ঠিক উপরের @ সিএস 95 এর উত্তরটি যুক্ত করতে চেয়েছিলাম, যা আমি বিশ্বাস করি এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। তার উত্তরে, তিনি দেখিয়েছেন যে পান্ডাস ভেক্টরাইজেশন ডেটাফ্রেমে স্টাফ গণনা করার জন্য অন্যান্য পান্ডাস পদ্ধতিগুলিকে ছাড়িয়ে যায়।

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

আপনি যদি @ সিএস 95 এর বেঞ্চমার্ক কোডটিতে নিম্নলিখিত ফাংশনগুলি যুক্ত করেন তবে এটি বেশ প্রকট হয়ে উঠবে:

def np_vectorization(df):
    np_arr = df.to_numpy()
    return pd.Series(np_arr[:,0] + np_arr[:,1], index=df.index)

def just_np_vectorization(df):
    np_arr = df.to_numpy()
    return np_arr[:,0] + np_arr[:,1]

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


1

আপনি numpyআরও বেশি গতির জন্য সূচীও করতে পারেন । এটি সত্যিই পুনরাবৃত্তি নয় তবে নির্দিষ্ট অ্যাপ্লিকেশনগুলির জন্য পুনরাবৃত্তির চেয়ে অনেক ভাল কাজ করে।

subset = row['c1'][0:5]
all = row['c1'][:]

আপনি এটি কোনও অ্যারেতে কাস্ট করতেও পারেন। এই সূচকগুলি / নির্বাচনগুলি ইতিমধ্যে নম্পি অ্যারেগুলির মতো কাজ করার কথা রয়েছে তবে আমি সমস্যার মধ্যে পড়েছিলাম এবং কাস্ট করা দরকার

np.asarray(all)
imgs[:] = cv2.resize(imgs[:], (224,224) ) #resize every image in an hdf5 file

1

পান্ডাস ডেটা ফ্রেমে সারিগুলিতে পুনরাবৃত্তি করার অনেকগুলি উপায় রয়েছে। একটি খুব সহজ এবং স্বজ্ঞাত উপায়:

df=pd.DataFrame({'A':[1,2,3], 'B':[4,5,6],'C':[7,8,9]})
print(df)
for i in range(df.shape[0]):
    # For printing the second column
    print(df.iloc[i,1])
    # For printing more than one columns
    print(df.iloc[i,[0,2]])

0

এই উদাহরণটি ডেটা ফ্রেমের প্রতিটি ডিজিটকে আলাদা করতে আইলোক ব্যবহার করে।

import pandas as pd

 a = [1, 2, 3, 4]
 b = [5, 6, 7, 8]

 mjr = pd.DataFrame({'a':a, 'b':b})

 size = mjr.shape

 for i in range(size[0]):
     for j in range(size[1]):
         print(mjr.iloc[i, j])

0

কিছু লাইব্রেরি (উদাহরণস্বরূপ একটি জাভা ইন্টারপ লাইব্রেরি যা আমি ব্যবহার করি) এর জন্য এক সাথে সারিতে ক্রমাগত মানগুলি প্রয়োজন হয়, উদাহরণস্বরূপ, যদি স্ট্রিমিং ডেটা হয়। স্ট্রিমিং প্রকৃতির প্রতিলিপি করতে, আমি আমার ডেটাফ্রেমের মানগুলি একের পর এক 'স্ট্রিম' করি, আমি নীচে লিখেছিলাম, যা সময়ে সময়ে কার্যকর হয়।

class DataFrameReader:
  def __init__(self, df):
    self._df = df
    self._row = None
    self._columns = df.columns.tolist()
    self.reset()
    self.row_index = 0

  def __getattr__(self, key):
    return self.__getitem__(key)

  def read(self) -> bool:
    self._row = next(self._iterator, None)
    self.row_index += 1
    return self._row is not None

  def columns(self):
    return self._columns

  def reset(self) -> None:
    self._iterator = self._df.itertuples()

  def get_index(self):
    return self._row[0]

  def index(self):
    return self._row[0]

  def to_dict(self, columns: List[str] = None):
    return self.row(columns=columns)

  def tolist(self, cols) -> List[object]:
    return [self.__getitem__(c) for c in cols]

  def row(self, columns: List[str] = None) -> Dict[str, object]:
    cols = set(self._columns if columns is None else columns)
    return {c : self.__getitem__(c) for c in self._columns if c in cols}

  def __getitem__(self, key) -> object:
    # the df index of the row is at index 0
    try:
        if type(key) is list:
            ix = [self._columns.index(key) + 1 for k in key]
        else:
            ix = self._columns.index(key) + 1
        return self._row[ix]
    except BaseException as e:
        return None

  def __next__(self) -> 'DataFrameReader':
    if self.read():
        return self
    else:
        raise StopIteration

  def __iter__(self) -> 'DataFrameReader':
    return self

যা ব্যবহার করা যেতে পারে:

for row in DataFrameReader(df):
  print(row.my_column_name)
  print(row.to_dict())
  print(row['my_column_name'])
  print(row.tolist())

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


0

সংক্ষেপে

  • সম্ভব হলে ভেক্টরাইজেশন ব্যবহার করুন
  • যদি অপারেশনটি ভেক্টরাইজ করা যায় না - তালিকা বোধগম্যতা ব্যবহার করুন
  • আপনার যদি পুরো সারিটি উপস্থাপন করে এমন একক অবজেক্টের প্রয়োজন হয় - itertuples ব্যবহার করুন
  • উপরেরটি যদি খুব ধীর হয় তবে swifter.apply ব্যবহার করে দেখুন
  • যদি এটি এখনও খুব ধীর হয় - Cython রুটিন চেষ্টা করে দেখুন

এই ভিডিওতে বিশদ

মাপকাঠি একটি পান্ডাস ডেটা ফ্রেমে সারিগুলির উপরে পুনরাবৃত্তির বেঞ্চমার্ক

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