একটি খালি পান্ডস ডেটা ফ্রেম তৈরি করছেন, তারপরে এটি পূরণ করছেন?


460

আমি এখানে পান্ডাস ডেটা ফ্রেম ডক্স থেকে শুরু করছি: http://pandas.pydata.org/pandas-docs/stable/dsintro.html

আমি টাইম সিরিজের ধরণের গণনাতে পুনরাবৃত্তভাবে মান ফ্রেম পূরণ করতে চাই। সুতরাং মূলত, আমি কলাম A, B এবং টাইমস্ট্যাম্প সারিগুলি, সমস্ত 0 বা সমস্ত NAN দিয়ে ডেটাফ্রেম শুরু করতে চাই।

আমি তখন প্রাথমিক মানগুলি যুক্ত করব এবং বলব row[A][t] = row[A][t-1]+1বা এর আগে সারি থেকে নতুন সারিটি গণনা করে এই ডেটাটি নিয়ে যাব ।

আমি বর্তমানে নীচের মতো কোডটি ব্যবহার করছি তবে আমার মনে হচ্ছে এটি একদম কুৎসিত এবং সরাসরি কোনও ডেটা ফ্রেমের সাহায্যে এটি করার একটি উপায় বা সাধারণভাবে আরও ভাল উপায় হতে হবে। দ্রষ্টব্য: আমি পাইথন ২.7 ব্যবহার করছি।

import datetime as dt
import pandas as pd
import scipy as s

if __name__ == '__main__':
    base = dt.datetime.today().date()
    dates = [ base - dt.timedelta(days=x) for x in range(0,10) ]
    dates.sort()

    valdict = {}
    symbols = ['A','B', 'C']
    for symb in symbols:
        valdict[symb] = pd.Series( s.zeros( len(dates)), dates )

    for thedate in dates:
        if thedate > dates[0]:
            for symb in valdict:
                valdict[symb][thedate] = 1+valdict[symb][thedate - dt.timedelta(days=1)]

    print valdict

5
কখনও ডেটা ফ্রেম বাড়ান না! অজগর তালিকায় যুক্ত হওয়া এবং মেমরি এবং কর্মক্ষমতা উভয় ক্ষেত্রে উভয়ই শেষে এটি ডেটাফ্রেমে রূপান্তর করা সর্বদা সস্তা is
cs95

@ সিএস 95 .appendপিডি এবং তালিকা সংযোজনের মধ্যে কার্যত কী আলাদা ? আমি জানি .appendপান্ডাসে পুরো ডেটাসেটটি কোনও নতুন অবজেক্টে অনুলিপি করে ´, অজগরটি কি আলাদাভাবে কাজ যুক্ত করে?
লামমা

@ লামা দয়া করে নীচে আমার উত্তরে বিশদটি সন্ধান করুন। ডিএফ-এ যুক্ত করার সময়, মেমোরিতে প্রতিটি নতুন বিদ্যমান ডাটা ব্যবহারের পরিবর্তে একটি নতুন ডেটাফ্রেম তৈরি করা হয় যা একেবারেই স্পষ্টভাবে নষ্ট করা।
CS95

উত্তর:


330

এখানে বেশ কয়েকটি পরামর্শ দেওয়া হল:

date_rangeসূচকের জন্য ব্যবহার করুন :

import datetime
import pandas as pd
import numpy as np

todays_date = datetime.datetime.now().date()
index = pd.date_range(todays_date-datetime.timedelta(10), periods=10, freq='D')

columns = ['A','B', 'C']

দ্রষ্টব্য: আমরা NaNকেবল খালি লিখে খালি ডেটা ফ্রেম ( গুলি) তৈরি করতে পারি :

df_ = pd.DataFrame(index=index, columns=columns)
df_ = df_.fillna(0) # with 0s rather than NaNs

ডেটা জন্য এই ধরণের গণনা করতে, একটি নমপি অ্যারে ব্যবহার করুন:

data = np.array([np.arange(10)]*3).T

তাই আমরা ডেটা ফ্রেম তৈরি করতে পারি:

In [10]: df = pd.DataFrame(data, index=index, columns=columns)

In [11]: df
Out[11]: 
            A  B  C
2012-11-29  0  0  0
2012-11-30  1  1  1
2012-12-01  2  2  2
2012-12-02  3  3  3
2012-12-03  4  4  4
2012-12-04  5  5  5
2012-12-05  6  6  6
2012-12-06  7  7  7
2012-12-07  8  8  8
2012-12-08  9  9  9

2
pd.date_range () আমার পক্ষে কাজ করে না। আমি ডেটরেঞ্জ দিয়ে চেষ্টা করেছি (গ্রহনের স্বতঃপূরণ থেকে), তবে এটি স্ট্রিংয়ের সাথে ডেট ফর্ম্যাট হিসাবে কাজ করে, তাই না? সামগ্রিক পন্থা যদিও কাজ করে (আমি সূচকে অন্য কিছুতে পরিবর্তন করেছি)।
ম্যাথিয়াস কাউয়ার

2
তারিখ_আরঞ্জ ডেটটাইম ইনডেক্স তৈরির জন্য একটি ফ্যাক্টরি ফাংশন এবং 0.8.0 এ একটি নতুন বৈশিষ্ট্য ছিল , আমি অবশ্যই সর্বশেষতম স্থিতিশীল রিলিজ (0.9.1) এ আপগ্রেড করার প্রস্তাব দিচ্ছি সেখানে অনেকগুলি বাগ ফিক্স এবং নতুন বৈশিষ্ট্য রয়েছে। :)
অ্যান্ডি হেডেন

26
আমার অভিজ্ঞতাগুলিতে, NaNs দিয়ে পূর্ণ প্রয়োজনীয় আকারের একটি ডেটা ফ্রেম তৈরি করা, এবং তারপরে মানগুলি পূরণ করা indexx 0মাত্রাগুলি ( columns = []) সহ ডেটা ফ্রেম তৈরি করা এবং লুপের প্রতিটি ঘুরে একটি কলাম সংযুক্ত করার চেয়ে অনেক ধীর । আমার অর্থ df[col_name] = pandas.Series([...])কলামের নামগুলির দ্বারা পুনরুক্ত হওয়া একটি লুপ in পূর্ববর্তী ক্ষেত্রে, কেবল মেমরি বরাদ্দের সময়ই লাগে না, তবে নতুন মানগুলির সাথে এনএএনগুলি প্রতিস্থাপন করা অত্যন্ত ধীর বলে মনে হয়।
ডিনেস

5
@ ডেডিনিস অবশ্যই এই উত্তরটি সম্ভবত এটি আরও পরিষ্কার করে দেওয়া উচিত - আপনি খুব কমই (যদি কখনও থাকেন) একটি খালি ডেটাফ্রেম (এনএএনএস) তৈরি করতে চান।
অ্যান্ডি হেডেন

1
এই উত্তরটি অনুযায়ী stackoverflow.com/a/30267881/2302569 আপনি fillna ফল বরাদ্দ করুন, অথবা পাস PARAM inplace = true প্রয়োজন
JayJay

169

আপনি যদি খালি ডেটা ফ্রেম তৈরি করতে চান এবং পরে কিছু ইনকামিং ডেটা ফ্রেম পূরণ করতে চান তবে এটি চেষ্টা করুন:

newDF = pd.DataFrame() #creates a new dataframe that's empty
newDF = newDF.append(oldDF, ignore_index = True) # ignoring index is optional
# try printing some data from newDF
print newDF.head() #again optional 

এই উদাহরণে আমি ব্যবহার করছি এই পান্ডাস ডক একটি নতুন ডাটা ফ্রেম তৈরি করতে এবং তারপর ব্যবহার পরিশেষে যোগ oldDF থেকে নেওয়া ডেটা দিয়ে newDF লিখতে।

যদি আমাকে একাধিক পুরাতন ডিএফ থেকে এই নতুন ডিএফ-তে নতুন ডেটা যুক্ত করতে হয়, তবে আমি কেবল লন্ডের জন্য পান্ডাসের পুনরাবৃত্তি করতে একটি ব্যবহার করব। ডেটা ফ্রেম.অ্যাপেন্ড ()


14
দয়া করে মনে রাখবেন append(এবং একইভাবে concat) প্রতিবার একটি নতুন অবজেক্টে সম্পূর্ণ ডেটাসেট অনুলিপি করে, সুতরাং, পুনরাবৃত্তি এবং সংযোজন একটি বড় কর্মক্ষমতা হিট করতে পারে এবং ঘটায়। : আরও তথ্যের জন্য পড়ুন pandas.pydata.org/pandas-docs/stable/merging.html
MoustafaAAtta

4
@ মৌস্তফাএআত্তা ডাটাফ্রেমে পুনরাবৃত্তভাবে ডেটা যুক্ত করার বিকল্পগুলি কী কী?
রহস্যগুই

2
এই পোস্টে @MoustafaAAtta হল ফ্রেড উত্তর: stackoverflow.com/questions/10715965/... দেখুন এই বিন্দু আরও ভাল?
রহস্যগুয়ে

@ মৌস্তফাএআত্তা আপনি সম্ভবত একটি ডাটাফ্রেমে সারি সারি যুক্ত করতে পারেন, এটি এখনও একটি নতুন অবজেক্ট তৈরি করবে তবে ছোট ডেটাসেটের জন্য, দরকারী হতে পারে। pandas.pydata.org/pandas-docs/stable/user_guide/…
গিকিধারার

135

একটি ডেটা ফ্রেম তৈরির সঠিক উপায়

TLDR; (কেবল সাহসী পাঠ্য পড়ুন)

এখানে বেশিরভাগ উত্তরগুলি আপনাকে একটি খালি ডেটা ফ্রেম তৈরি এবং এটি পূরণ করার পদ্ধতি সম্পর্কে জানাবে, তবে কেউ আপনাকে বলবে না যে এটি করা খারাপ কাজ।

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

data = []
for a, b, c in some_function_that_yields_data():
    data.append([a, b, c])

df = pd.DataFrame(data, columns=['A', 'B', 'C'])

খালি ডেটাফ্রেম (বা এনএএনগুলির মধ্যে একটি) তৈরি করা এবং বার বার এটি যুক্ত করার চেয়ে তালিকায় যুক্ত হওয়া এবং একযোগে ডেটা ফ্রেম তৈরি করা সর্বদা সস্তা is তালিকাগুলিও কম স্মৃতি গ্রহণ করে এবং এটি কাজ করার জন্য অনেক হালকা ডেটা স্ট্রাকচার , সংযোজন করতে এবং মুছে ফেলার জন্য (যদি প্রয়োজন হয়) ।

এই পদ্ধতির অন্যান্য সুবিধা হ'ল dtypesস্বয়ংক্রিয়ভাবে অনুমান করা হয় ( objectতাদের সকলের জন্য বরাদ্দ না করে)।

শেষ সুবিধাটি হ'ল একটি RangeIndexহ'ল স্বয়ংক্রিয়ভাবে আপনার ডেটার জন্য তৈরি হয় , তাই এটি নিয়ে চিন্তিত হওয়া কম জিনিস (দরিদ্রদের দিকে একবার নজর দিন appendএবংloc নীচের পদ্ধতিগুলি দেখুন, আপনি উভয় উপাদানই দেখতে পাবেন যার জন্য সূচককে যথাযথভাবে পরিচালনা করা প্রয়োজন)।


আপনার যা করা উচিত নয়

append অথবা concat একটি লুপ ভিতরে

আমি এখানে প্রথম দিক থেকে সবচেয়ে বড় ভুলটি দেখেছি:

df = pd.DataFrame(columns=['A', 'B', 'C'])
for a, b, c in some_function_that_yields_data():
    df = df.append({'A': i, 'B': b, 'C': c}, ignore_index=True) # yuck
    # or similarly,
    # df = pd.concat([df, pd.Series({'A': i, 'B': b, 'C': c})], ignore_index=True)

আপনার প্রতিটি appendবা concatঅপারেশনের জন্য মেমরি পুনরায় বরাদ্দ করা হয়। একটি লুপ সঙ্গে দম্পতি এই এবং আপনি একটি আছে দ্বিঘাত জটিলতা অপারেশন । থেকে df.appendডক পৃষ্ঠা :

স্বতঃস্ফূর্তভাবে একটি ডেটা ফ্রেমে সারি যুক্ত করা একটি একক কনটেনেটের চেয়ে আরও বেশি গণনামূলক নিবিড় হতে পারে। একটি ভাল সমাধান হ'ল এই সারিগুলিকে একটি তালিকায় যুক্ত করা এবং তারপরে তালিকাটি একবারে মূল ডেটা ফ্রেমের সাথে সংযুক্ত করা।

এর সাথে যুক্ত অন্য ভুলটি df.appendহ'ল ব্যবহারকারীরা অ্যাপেনড ভুলে যাওয়ার প্রবণতা কোনও স্থানের কোনও কাজ নয় , সুতরাং ফলাফলটি অবশ্যই বরাদ্দ করতে হবে। টাইপগুলি সম্পর্কে আপনাকেও চিন্তা করতে হবে:

df = pd.DataFrame(columns=['A', 'B', 'C'])
df = df.append({'A': 1, 'B': 12.3, 'C': 'xyz'}, ignore_index=True)

df.dtypes
A     object   # yuck!
B    float64
C     object
dtype: object

অবজেক্ট কলামগুলির সাথে ডিল করা কখনই ভাল জিনিস নয়, কারণ পান্ডারা those কলামগুলিতে অপারেশনকে ভেক্টরাইজ করতে পারে না। এটি ঠিক করার জন্য আপনাকে এটি করতে হবে:

df.infer_objects().dtypes
A      int64
B    float64
C     object
dtype: object

loc একটি লুপ ভিতরে

আমি locখালি তৈরি করা ডেটাফ্রেমে সংযোজন করতেও ব্যবহার করতে দেখেছি :

df = pd.DataFrame(columns=['A', 'B', 'C'])
for a, b, c in some_function_that_yields_data():
    df.loc[len(df)] = [a, b, c]

আগের মত, আপনি প্রতিবার যে পরিমাণ মেমরি প্রয়োজন তা আপনি প্রাক-বরাদ্দ করেননি, তাই প্রতিবার নতুন সারি তৈরি করার সময় মেমরিটি আবার বাড়ানো হয় । এটা ঠিক হিসাবে খারাপappend , তেমনি আরও ।

এনএএনদের খালি ডেটাফ্রেম

এবং তারপরে, সেখানে NaNs এর একটি ডেটাফ্রেম তৈরি করা হচ্ছে এবং এর সাথে যুক্ত সমস্ত ক্যাভ্যাট রয়েছে।

df = pd.DataFrame(columns=['A', 'B', 'C'], index=range(5))
df
     A    B    C
0  NaN  NaN  NaN
1  NaN  NaN  NaN
2  NaN  NaN  NaN
3  NaN  NaN  NaN
4  NaN  NaN  NaN

এটি অন্যের মতো অবজেক্ট কলামগুলির একটি ডেটাফ্রেম তৈরি করে।

df.dtypes
A    object  # you DON'T want this
B    object
C    object
dtype: object

উপরোক্ত পদ্ধতি হিসাবে এখনও যোগ করার সমস্ত সমস্যা রয়েছে all

for i, (a, b, c) in enumerate(some_function_that_yields_data()):
    df.iloc[i] = [a, b, c]

প্রুফ পুডিংয়ে আছে

এই পদ্ধতিগুলির সময় নির্ধারণ করা তাদের স্মৃতি এবং ইউটিলিটির দিক থেকে কতটা পৃথক see তা দেখার দ্রুততম উপায়।

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

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


6
তালিকার
সংযুক্তি

9
এটি আরও এক মিলিয়ন গুণ বেশি সময় বাড়ানো দরকার। কখনও ডেটাফ্রেম বাড়ান না!
বুগী

3
@ ব্যবহারকারী3293236 খুব খারাপ আপনি প্রতিবার কোনও পুরানো প্রশ্নের উত্তর দেওয়ার সময় নীচ থেকে শুরু করতে হবে;)
সিএস 95

2
এটি আমি সবচেয়ে বেশি ঘৃণা করি সেগুলির মধ্যে একটি। এই বহুবার আপনি see 𝒄𝒐𝒓𝒓𝒆𝒄𝒕 see দেখতে পান যা কেবলমাত্র কয়েকটি ভোট নিয়ে কোথাও থেকে যায় এবং কখনও গ্রহণযোগ্য হয় না। আমি খালি পান্ডাস ডেটা ফ্রেম তৈরি করতে 𝚍𝚏 = 𝚙𝚍.𝙳𝚊𝚝𝚊𝙵𝚛𝚊𝚖𝚎 ([]) এর সাথে কোডটি মিস করছি। এই উত্তরটি সমর্থন করে। দুর্দান্ত ব্যাখ্যা, @ সিএস 95!
জোনাথন

1
এটি আক্ষরিকভাবে ডকুমেন্টেশনে রয়েছে। "স্বতঃস্ফূর্তভাবে একটি ডেটাফ্রেমে সারি যুক্ত করা একটি একক কনটেনেটের চেয়ে আরও নিরঙ্কুশভাবে নিবিড় হতে পারে those এই সারিগুলিকে একটি তালিকায় যুক্ত করা এবং তারপরে তালিকাটি একবারে মূল ডেটা ফ্রেমের সাথে সংযুক্ত করা আরও ভাল সমাধান।" pandas.pydata.org/pandas-docs/version/0.21/generated/…
এন্ডোলিথ

132

কলামের নাম দিয়ে খালি ফ্রেম শুরু করুন

import pandas as pd

col_names =  ['A', 'B', 'C']
my_df  = pd.DataFrame(columns = col_names)
my_df

একটি ফ্রেমে একটি নতুন রেকর্ড যুক্ত করুন

my_df.loc[len(my_df)] = [2, 4, 5]

আপনি একটি অভিধানও পাস করতে চাইতে পারেন:

my_dic = {'A':2, 'B':4, 'C':5}
my_df.loc[len(my_df)] = my_dic 

আপনার বিদ্যমান ফ্রেমে অন্য ফ্রেম যুক্ত করুন

col_names =  ['A', 'B', 'C']
my_df2  = pd.DataFrame(columns = col_names)
my_df = my_df.append(my_df2)

পারফরম্যান্স বিবেচনা

যদি আপনি একটি লুপের মধ্যে সারি যুক্ত করে থাকেন তবে পারফরম্যান্সের বিষয়গুলি বিবেচনা করুন। প্রায় প্রথম 1000 রেকর্ডের জন্য "my_df.loc" পারফরম্যান্স আরও ভাল তবে লুপের রেকর্ডের সংখ্যা বাড়িয়ে এটি ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে বেড়ে যায়।

যদি আপনি কোনও বড় লুপের ভিতরে পাতলা করার পরিকল্পনা করেন (10 এমএএ রেকর্ড বা তাই বলুন), আপনি এই দুটিটির মিশ্রণটি ব্যবহার করা ভাল; আকারটি 1000 টি না হওয়া পর্যন্ত আইলোকের সাথে একটি ডেটাফ্রেম পূরণ করুন, তারপরে এটিকে মূল ডেটাফ্রেমে যুক্ত করুন এবং অস্থায়ী ডেটা ফ্রেম খালি করুন। এটি আপনার কার্যকারিতা প্রায় 10 বার বাড়িয়ে তুলবে।


my_df = my_df.append(my_df2)আমি নির্দিষ্ট না করে আমার জন্য কাজ করে না ignore_index=True
নাসিফ ইমতিয়াজ ওহি

0

19 টি সারি সহ একটি ডেটাফ্রেম ধরে নিন

index=range(0,19)
index

columns=['A']
test = pd.DataFrame(index=index, columns=columns)

ধ্রুবক হিসাবে কলাম এ রাখছি

test['A']=10

একটি লুপ দ্বারা প্রদত্ত ভেরিয়েবল হিসাবে কলামে খ রাখা

for x in range(0,19):
    test.loc[[x], 'b'] = pd.Series([x], index = [x])

আপনি pd.Series([x], index = [x])কোনও মান দিয়ে প্রথম এক্স প্রতিস্থাপন করতে পারেন

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