python - কিভাবে Pandas একটি ডাটাফ্রেমে সারি উপর পুনরাবৃত্তি করবেন?




rows dataframe (10)

IMHO, সহজতম সিদ্ধান্ত

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

আমি pandas থেকে একটি 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 বস্তু কী এবং আমি কিভাবে এটির সাথে কাজ করতে পারি।


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

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

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

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

আপনি এটি একটি অ্যারে নিক্ষেপ করতে পারেন। এই সূচী / নির্বাচন ইতিমধ্যে Numpy অ্যারে মত কাজ করা অনুমিত হয় কিন্তু আমি বিষয় মধ্যে দৌড়ে এবং নিক্ষেপ করা প্রয়োজন

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

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

DataFrame.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)

উপরে উত্তর যোগ করা, কখনও কখনও একটি দরকারী প্যাটার্ন হয়:

# 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}

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

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

কেন জটিলতা জটিল?

সহজ।

import pandas as pd
import numpy as np

# Here is an example dataframe
df_existing = pd.DataFrame(np.random.randint(0,100,size=(100, 4)), columns=list('ABCD'))

for idx,row in df_existing.iterrows():
    print row['A'],row['B'],row['C'],row['D']

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

itertuples() iterrows() তুলনায় দ্রুত হতে অনুমিত হয় iterrows()

তবে সচেতন থাকুন, দস্তাবেজ অনুযায়ী (এই মুহুর্তে প্যানডগুলি 0.21.1):

  • iterrows: dtype সারি থেকে সারিতে মেলে dtype হতে পারে

    Itarows প্রতিটি সারির জন্য একটি সিরিজ প্রদান করে, কারণ এটি সারি জুড়ে dtypes সংরক্ষণ করা হয় না (Dtypes ডেটাফ্রেম জন্য কলাম জুড়ে সংরক্ষিত হয়)।

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

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

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

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

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


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

Itertuples () ব্যবহার করুন। এটা iterrows () থেকে দ্রুত হয়:

for row in df.itertuples():
    print "c1 :",row.c1,"c2 :",row.c2






dataframe