পান্ডাস ডেটা ফ্রেমে মেটা-তথ্য / মেটাডেটা যুক্ত করা হচ্ছে


90

কোনও পান্ডাস ডেটা ফ্রেমে কিছু মেটা-তথ্য / মেটাডেটা যুক্ত করা কি সম্ভব?

উদাহরণস্বরূপ, উপাত্তের নাম ডেটা পরিমাপ করতে ব্যবহৃত, যন্ত্রটি দায়বদ্ধ ইত্যাদি

এই তথ্য দিয়ে একটি কলাম তৈরি করা এক কাজ হতে পারে তবে প্রতিটি সারিতে একটি টুকরো তথ্য সংরক্ষণ করা অপব্যয় বলে মনে হচ্ছে!


দয়া করে @ryanjdillon উত্তরটি (বর্তমানে নীচের অংশে সমাহিত) নোট করুন যা আপডেটের পরীক্ষামূলক গুণাবলী '
অ্যাটর্স'-এর

উত্তর:


85

অবশ্যই, বেশিরভাগ পাইথন অবজেক্টের মতো আপনি একটিতে নতুন বৈশিষ্ট্য সংযুক্ত করতে পারেন pandas.DataFrame:

import pandas as pd
df = pd.DataFrame([])
df.instrument_name = 'Binky'

উল্লেখ্য, যে আপনি একটি DataFrame করতে বৈশিষ্ট্যাবলী সংযুক্ত করতে পারেন যখন অপারেশন DataFrame সম্পাদনা (যেমন groupby, pivot, joinবা locশুধু কয়েক নাম) একটি নতুন DataFrame ফেরত দিতে পারেন ছাড়া মেটাডেটা সংযুক্ত করা হয়েছে। পান্ডার কাছে ডেটাফ্রেমে সংযুক্ত মেটাডেটা প্রচারের শক্ত পদ্ধতি এখনও নেই ।

কোনও ফাইলে মেটাডেটা সংরক্ষণ করা সম্ভব। আপনি কিভাবে একটি HDF5 ফাইলে মেটাডেটা সঞ্চয় করতে একটি উদাহরণ জানতে পারেন এখানে


4
+1 আপনার জন্য পছন্দসই নামের পছন্দ! এইচডিএফএস স্টোরগুলিতে এই অতিরিক্ত বৈশিষ্ট্যগুলি ফেলে দেওয়ার চেষ্টা করার কি আপনার কোনও অভিজ্ঞতা আছে?
ড্যান অ্যালান

4
@ ড্যান অ্যালান: যদি store = pd.HDFStore(...)তবে বৈশিষ্ট্যগুলি সংরক্ষণ করা যায় store.root._v_attrs.key = value
unutbu

4
অন্য কারও কাছে যারা এটি ব্যবহার করতে পারে: ডক্স এটিতে একটি বিভাগ যুক্ত করেছে। pandas.pydata.org/pandas-docs/dev/cookbook.html#hdfstore
ড্যান অ্যালান


4
পান্ডাসে 0.23.1 তে, অভিধান, তালিকা বা টিপল বরাদ্দ করে একটি নতুন বৈশিষ্ট্য তৈরি করা একটি সতর্কতা দেয় (অর্থাত্ df = pd.DataFrame(); df.meta = {}উত্পাদন করে UserWarning: Pandas doesn't allow columns to be created via a new attribute name - see https://pandas.pydata.org/pandas-docs/stable/indexing.html#attribute-access)। (বৈশিষ্ট্যটি ইতিমধ্যে হিসাবে তৈরি করা থাকলে কোনও সতর্কতা দেওয়া হয় না df = pd.DataFrame(); df.meta = ''; df.meta = {})।
teichert

13

এই সমস্যাটি খালি নিজেই চালিয়েছি। প্যান্ডাস ০.০৩ অনুসারে, ডেটা ফ্রেমগুলিতে তাদের মধ্যে একটি _মেটাডাটা অ্যাট্রিবিউট রয়েছে যা নতুন ডেটাফ্রেমগুলি ফিরিয়ে দেয় এমন ফাংশনগুলির মাধ্যমে অবিচ্ছিন্ন থাকে। এছাড়াও সিরিয়ালাইজেশনটি ঠিকঠাকভাবে বেঁচে থাকতে পারে বলে মনে হয় (আমি কেবল জসন চেষ্টা করেছি, তবে আমি ধারণা করি যে এইচডিএফটিও কভার করা আছে)।


16
_metadataজনসাধারণের API এর অংশ নয়, তাই আমি এই কার্যকারিতাটির উপর নির্ভর করার বিরুদ্ধে দৃ strongly়তার সাথে সুপারিশ করব।
shoyer

@ স্টেফান আপনি কি দয়া করে এটিকে বিস্তারিত বলতে পারবেন? কেন পাবলিক এপিআইয়ের অংশ হওয়া গুরুত্বপূর্ণ? আপনার বিবৃতি 0.15 সংস্করণের জন্যও সত্য?
টমচো 13

4
@ টমচো হ্যাঁ, উত্তরটি এখনও সত্য। মেটাডেটা সমর্থন করে এমন একটি লেবেলযুক্ত অ্যারের বিকল্প বিকল্পের জন্য আপনি xray ( github.com/xray/xray ) এ একবার দেখে নিতে পারেন, বিশেষত যদি আপনার কাছে বহুমাত্রিক ডেটা থাকে ( .attrsxray API এর অংশ)
shoyer

17
_metadataআসলে একটি শ্রেণি বৈশিষ্ট্য, উদাহরণ বৈশিষ্ট্য নয়। DataFrameমডিউলটি যতক্ষণ লোড থাকে ততক্ষণ নতুন উদাহরণগুলি পূর্ববর্তীগুলির থেকে উত্তরাধিকারী হয়। _metadataকোন কিছুর জন্য ব্যবহার করবেন না । +1 এর জন্য xarray!
j08lue

4
_মেটাডাটা - একটি অসমর্থিত বৈশিষ্ট্য যা আমার দিনটি বাঁচিয়েছে! ধন্যবাদ.
জোকি

12

আসলে তা না. যদিও আপনি @ ইউনতবুবু উল্লেখ করেছেন হিসাবে ডেটাফ্রেম ক্লাসে মেটাডেটা যুক্ত বৈশিষ্ট্যগুলি যুক্ত করতে পেরেছিলেন, অনেকগুলি ডাটাফ্রেম পদ্ধতিতে একটি নতুন ডেটাফ্রেম ফিরে আসে, যাতে আপনার মেটা ডেটা নষ্ট হয়ে যায়। আপনার যদি আপনার ডেটাফ্রেমটি পরিচালনা করতে হয় তবে সর্বোত্তম বিকল্পটি হবে আপনার মেটাটাটা এবং ডেটাফ্রেমটিকে অন্য শ্রেণিতে আবৃত করা। গিটহাব-এ এই আলোচনাটি দেখুন: https://github.com/pydata/pandas/issues/2485

একটি মেটাডেটা ফ্রেম অবজেক্ট যুক্ত করার জন্য বর্তমানে একটি খোলা টান অনুরোধ রয়েছে , যা আরও মেটাডেটা সমর্থন করবে।


11

প্যান্ডাস 1.0 হিসাবে, সম্ভবত আগে, এখন একটি Dataframe.attrsসম্পত্তি আছে। এটি পরীক্ষামূলক, তবে ভবিষ্যতে আপনি যা চান এটি সম্ভবত এটিই। উদাহরণ স্বরূপ:

import pandas as pd
df = pd.DataFrame([])
df.attrs['instrument_name'] = 'Binky'

এটি এখানে ডক্সে সন্ধান করুন

এর to_parquetপরে এবং এর চেষ্টা করেও from_parquetএটি মনে হচ্ছে না, সুতরাং আপনার ব্যবহারের ক্ষেত্রে এটি পরীক্ষা করে দেখুন be


এটি আকর্ষণীয় এবং এটি অনুলিপি / লোক / আইলোকের জন্য অবিচ্ছিন্ন বলে মনে হচ্ছে তবে গ্রুপবাইয়ের জন্য নয়।
জন

কেবল একটি পরামর্শ, তবে সম্ভবত এটি কীভাবে ব্যবহার করবেন তার একটি উদাহরণ দেখান? ডকুমেন্টেশনটি মূলত কিছুই নয়, তবে কেবল এটির সাথে অভিনয় করেই আমি দেখতে পাচ্ছি যে এটি একটি খালি অভিধান হিসাবে আরম্ভ করা হয়েছে এবং এটি সেট আপ করা হয়েছে বলে মনে হচ্ছে এটি অবশ্যই একটি অভিধান হতে হবে যদিও অবশ্যই এটির ভিতরে একটি তালিকা বাসা বাঁধতে পারে, উদাহরণ স্বরূপ.
জন

4
আপনি এই স্ট্যাকওভারফ্লো আলোচনাকে দরকারী হিসাবে দেখতে পারেন কারণ এটি প্রয়োজন বোধ করা হলে parquet ফাইলগুলিতে কীভাবে কাস্টম মেটাডেটা যুক্ত করবেন
rdmolony

4
@ আরডমোলনি এটি দুর্দান্ত। আমি মনে করি dataclassমেটাডেটার জন্য একটি ব্যবহার করে এবং তারপরে DataFrameআপনার ভাগ করা পোস্টে লোড / ডাম্পিংয়ের পদ্ধতিটি করার জন্য সাবক্লাসিং একটি দুর্দান্ত সমাধান হতে পারে।
রায়ানজডিলন

4
এটা সুন্দর. গৃহীত উত্তরের বিপরীতে, এটি আচার থেকে সংরক্ষণ এবং লোড করার পরে বৈশিষ্ট্যগুলি সংরক্ষণ করে!
সিজিএফএক্স

8

ডেটাফ্রেম অবজেক্টে স্বেচ্ছাচারী গুণাবলী সংযুক্ত করার শীর্ষ উত্তরটি ভাল তবে আপনি যদি অভিধান, তালিকা বা টিপল ব্যবহার করেন তবে এটি "পান্ডারা নতুন বৈশিষ্ট্যের নামের মাধ্যমে কলাম তৈরি করতে দেয় না" এর ত্রুটি নির্গত করে। নিম্নলিখিত সমাধানটি স্বেচ্ছাচারিত গুণাবলী সংরক্ষণের জন্য কাজ করে।

from types import SimpleNamespace
df = pd.DataFrame()
df.meta = SimpleNamespace()
df.meta.foo = [1,2,3]

এছাড়াও, আপনি যদি নিজের ডেটাফ্রেমের অনুলিপিগুলি ধরে রাখতে চান তবে আপনাকে এটি করতে হবে pd.DataFrame._metadata += ["meta"]। মনে রাখবেন যে এই অংশটি পান্ডসের একটি বৈশিষ্ট্য, আপনার নির্দিষ্ট ডেটাফ্রেমের কোনও গুণ নয়
বিস্কান

এই পন্থাটি আর কাজ করবে না যেহেতু df.metaএকটি সতর্কতা ট্রিগার করে যে পান্ডারা এভাবে নতুন কলাম তৈরি করতে দেয় না।
anishtain4

@ anishtain4, আমি কেবল এটি পান্ডাস 25.1 (2 সপ্তাহ আগে প্রকাশিত) দিয়ে পরীক্ষা করেছি এবং এই কোডটি এখনও আমার পক্ষে কাজ করে। df.metaসরলনামস্পেস থেকে যে সতর্কতাটি ট্রিগার করা হয়নি। পান্ডারা এ থেকে কলাম তৈরি করার চেষ্টা করবেন না।
বিএসএসএন

6

যেমন অন্যান্য উত্তর এবং মন্তব্যে উল্লিখিত হয়েছে, _metadataএটি সর্বজনীন এপিআইয়ের একটি অংশ নয়, সুতরাং এটি উত্পাদন পরিবেশে এটি ব্যবহার করা অবশ্যই ভাল ধারণা নয়। তবে আপনি এখনও এটি গবেষণা প্রোটোটাইপিংয়ে ব্যবহার করতে এবং এটি কাজ করা বন্ধ করে দিলে এটি প্রতিস্থাপন করতে চাইতে পারেন। এবং এই মুহুর্তে এটি groupby/ এর সাথে কাজ করে applyযা সহায়ক। এটি একটি উদাহরণ (যা আমি অন্যান্য উত্তরে খুঁজে পাইনি):

df = pd.DataFrame([1, 2, 2, 3, 3], columns=['val']) 
df.my_attribute = "my_value"
df._metadata.append('my_attribute')
df.groupby('val').apply(lambda group: group.my_attribute)

আউটপুট:

val
1    my_value
2    my_value
3    my_value
dtype: object

4

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

আপনাকে কয়েকটি সাধারণ ফর্ম্যাটের জন্য এইচডিএফ 5 থেকে দ্রুত পড়তে / লিখতে দেওয়া উচিত, এর মধ্যে একটি ডেটাফ্রেম। সুতরাং আপনি উদাহরণস্বরূপ অভিধানে একটি ডেটাফ্রেম রাখতে পারেন এবং অভিধানে ক্ষেত্র হিসাবে মেটাডেটা অন্তর্ভুক্ত করতে পারেন। যেমন:

save_dict = dict(data=my_df, name='chris', record_date='1/1/2016')
h5io.write_hdf5('path/to/file.hdf5', save_dict)
in_data = h5io.read_hdf5('path/to/file.hdf5')
df = in_data['data']
name = in_data['name']
etc...

আরেকটি বিকল্প হ'ল এক্স্রেয়ের মতো একটি প্রকল্প অনুসন্ধান করা , যা কিছু উপায়ে আরও জটিল, তবে আমি মনে করি এটি আপনাকে মেটাডেটা ব্যবহার করতে দেয় এবং ডেটা ফ্রেমে রূপান্তরিত করা বেশ সহজ।


4

@ সোলডগ্রাফ দ্বারা উল্লিখিত হিসাবে আমি ডেটা তুলনা করার সময় এবং বেশ কয়েকটি ডেটাফ্রেমের মধ্যে ফলাফলের পরিকল্পনার সময় মেটাডেটা সংযুক্ত করার জন্য জারারিকে একটি দুর্দান্ত সরঞ্জাম হিসাবে পেয়েছি।

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

df = pd.read_csv(meaningless_test)
metadata = {'fw': foo, 'test_name': bar, 'scenario': sc_01}
ds = xr.Dataset.from_dataframe(df)
ds.attrs = metadata

2

আমি একটি সমাধান খুঁজছি এবং খুঁজে পেয়েছি যে পান্ডাস ফ্রেমের সম্পত্তি রয়েছে attrs

pd.DataFrame().attrs.update({'your_attribute' : 'value'})
frame.attrs['your_attribute']

আপনি যখনই এটি পাস করবেন তখন এই বৈশিষ্ট্যটি সর্বদা আপনার ফ্রেমে আটকে থাকবে!


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

দুর্ভাগ্যক্রমে, অ্যাট্রেটাররা নতুন ডেটাফ্রেমে অনুলিপি করা হয় না :(
অ্যাডাম

1

আমার একই সমস্যা ছিল এবং আমি মেটাডেটা দিয়ে একটি অভিধান থেকে একটি নতুন, ছোট ডিএফ তৈরির কাজটি ব্যবহার করেছি:

    meta = {"name": "Sample Dataframe", "Created": "19/07/2019"}
    dfMeta = pd.DataFrame.from_dict(meta, orient='index')

এই dfMeta এর পরে আপনার মূল DF এর সাথে আচার ইত্যাদিতে সংরক্ষণ করা যায়

আচার ফাইলে একাধিক বস্তু সংরক্ষণ এবং লোড করা দেখুন ? (লুটজের উত্তর) আচার ব্যবহার করে একাধিক ডেটাফ্রেমগুলি সংরক্ষণ এবং পুনরুদ্ধারে দুর্দান্ত উত্তরের জন্য

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