मेटा-जानकारी / मेटाडेटा को पांडा से जोड़ना DataFrame


93

क्या कुछ मेटा-जानकारी / मेटाडेटा को एक पांडा डेटाफ़्रेम में जोड़ना संभव है?

उदाहरण के लिए, उपकरण का नाम डेटा को मापने के लिए उपयोग किया जाता है, उपकरण जिम्मेदार है, आदि।

उस जानकारी के साथ एक स्तंभ बनाने के लिए एक वर्कअराउंड होगा, लेकिन हर पंक्ति में जानकारी का एक टुकड़ा संग्रहीत करना व्यर्थ लगता है!


कृपया ध्यान दें @ryanjdillon उत्तर (वर्तमान में नीचे के पास दफन है) जिसमें अद्यतन प्रयोगात्मक विशेषता 'अटार्स' का उल्लेख है जो एक शुरुआत की तरह लगता है, शायद
जॉनी

जवाबों:


87

निश्चित रूप से, अधिकांश पायथन वस्तुओं की तरह, आप नई विशेषताओं को संलग्न कर सकते हैं pandas.DataFrame:

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

हालांकि, ध्यान दें कि आप एक DataFrame के लिए गुण संलग्न कर सकते हैं, जबकि, संचालन DataFrame पर प्रदर्शन (जैसे groupby, pivot, joinया locबस कुछ ही नाम के लिए) एक नई DataFrame वापस आ सकते हैं बिना मेटाडाटा संलग्न। पंडों के पास अभी तक डाटाफ्रेम से जुड़ी मेटाडेटा के प्रचार का एक मजबूत तरीका नहीं है ।

किसी फ़ाइल में मेटाडेटा को संरक्षित करना संभव है। आप यहां HDF5 फ़ाइल में मेटाडेटा को संग्रहीत करने के तरीके का एक उदाहरण पा सकते हैं ।


5
आप साधन नाम की पसंद के लिए +1! क्या आपके पास HDFStore में इन अतिरिक्त विशेषताओं को डंप करने का कोई अनुभव है?
दान एलन

4
@ डानॉलन: यदि store = pd.HDFStore(...), तो विशेषताओं को संगृहीत किया जा सकता है store.root._v_attrs.key = value
अप्रयुक्त

3
किसी अन्य व्यक्ति के लिए जो इसका उपयोग कर सकता है: डॉक्स ने इस पर एक खंड जोड़ा है। pandas.pydata.org/pandas-docs/dev/cookbook.html#hdfstore
Dan Allan


5
पांडा ०.२३.१ में, शब्दकोश, सूची या टपल को निर्दिष्ट करके एक नई विशेषता का निर्माण एक चेतावनी देता है (यानी 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 = {})।
टिचर्ट

14

पांडा के रूप में 1.0, संभवतः पहले, अब एक Dataframe.attrsसंपत्ति है। यह प्रायोगिक है, लेकिन भविष्य में आप यही चाहते हैं। उदाहरण के लिए:

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

इसे डॉक्स में यहां खोजें

के साथ इस बाहर की कोशिश कर रहा to_parquetहै और फिर from_parquet, यह जारी रहती है प्रतीत नहीं होता है, तो सुनिश्चित करें कि आप कि आपके उपयोग के मामले के साथ की जाँच हो।


यह दिलचस्प है और प्रतिलिपि / नियंत्रण रेखा / iloc के लिए बनी रहती है, लेकिन समूह के लिए नहीं।
जॉनी

सिर्फ एक सुझाव, लेकिन शायद इसका उपयोग कैसे करना है, इसका एक उदाहरण दिखाएं प्रलेखन मूल रूप से कुछ भी नहीं है, लेकिन सिर्फ इसके साथ खेलने से मैं देख सकता हूं कि इसे एक खाली शब्दकोश के रूप में आरंभीकृत किया गया है और इसे इसलिए सेट किया गया लगता है कि इसे एक शब्दकोश होना चाहिए, हालांकि इसके अंदर एक सूची को घोंसला कर सकता है, उदाहरण के लिए।
जॉनी

1
आपको यह Stackoverflow चर्चा उपयोगी हो सकती है क्योंकि यह दर्शाता है कि कस्टम मेटाडेटा फ़ाइलों को जोड़ने के लिए कैसे यदि आवश्यक हो
rdmolony

1
@rdmolony यह बहुत अच्छा है। मुझे लगता है dataclassकि मेटाडेटा के लिए उपयोग करना और फिर DataFrameआपके द्वारा साझा किए गए पोस्ट के रूप में लोड / डंपिंग करने की एक विधि का उपवर्ग करना एक अच्छा समाधान हो सकता है।
ryanjdillon

1
यह अच्छा है। स्वीकृत उत्तर के विपरीत, यह अचार से बचाने और लोड करने के बाद विशेषताओं को संरक्षित करता है!
CGFoX

13

बस इस मुद्दे में खुद भाग गया। पांडा 0.13 के रूप में, डेटाफ़्रेम में उन पर एक _metadata विशेषता होती है जो नए डेटाफ़्रेम को वापस करने वाले फ़ंक्शंस के माध्यम से बनी रहती है। यह भी ठीक है क्रमिक रूप से जीवित रहने के लिए लगता है (मैं केवल json की कोशिश की है, लेकिन मुझे लगता है कि hdf के रूप में अच्छी तरह से कवर किया गया है)।


16
_metadataसार्वजनिक एपीआई का हिस्सा नहीं है, इसलिए मैं इस कार्यक्षमता पर भरोसा करने के खिलाफ दृढ़ता से सिफारिश करूंगा।
शॉयर

@ स्टेफ़न क्या आप कृपया उस पर विस्तार से बता सकते हैं? सार्वजनिक एपीआई का हिस्सा बनना क्यों महत्वपूर्ण है? क्या आपका कथन 0.15 संस्करण के लिए भी सही है?
टॉमक्रू

1
@TomCho हां, यह जवाब आज भी सच है। आप मेटाडाटा का समर्थन करने वाले लेबल सरणी के एक वैकल्पिक उदाहरण के लिए xray ( github.com/xray/xray ) पर एक नज़र डाल सकते हैं , खासकर यदि आपके पास बहुआयामी डेटा है ( .attrs
xray

17
_metadataवास्तव में एक वर्ग विशेषता है, उदाहरण विशेषता नहीं। जब DataFrameतक मॉड्यूल लोड रहता है, तब तक नए उदाहरण पिछले वाले से विरासत में मिलते हैं। _metadataकिसी भी चीज के लिए उपयोग न करें । +1 के लिए xarray!
j0,000ue

1
_metadata - एक असमर्थित सुविधा जिसने मेरा दिन बचाया! धन्यवाद।
जौक्टी

12

ज़रुरी नहीं। हालाँकि आप मेटाडेटा वाली विशेषताओं को DataFrame वर्ग में @unutbu उल्लेख के रूप में जोड़ सकते हैं, कई DataFrame विधियाँ एक नया DataFrame लौटाती हैं, जिससे आपका मेटा डेटा खो जाएगा। यदि आपको अपने डेटाफ्रेम में हेरफेर करने की आवश्यकता है, तो सबसे अच्छा विकल्प आपके मेटाडेटा और डेटाफ्रेम को किसी अन्य वर्ग में लपेटना होगा। GitHub: https://github.com/pydata/pandas/issues/2485 पर यह चर्चा देखें

मेटाडाटाफ्रेम ऑब्जेक्ट जोड़ने के लिए वर्तमान में एक खुला पुल अनुरोध है, जो मेटाडेटा को बेहतर समर्थन करेगा।


8

DataFrame ऑब्जेक्ट में मनमानी विशेषताओं को संलग्न करने का शीर्ष उत्तर अच्छा है, लेकिन यदि आप एक शब्दकोश, सूची या टपल का उपयोग करते हैं, तो यह "पंडों को एक नए विशेषता नाम के माध्यम से कॉलम बनाने की अनुमति नहीं देता" की एक त्रुटि का उत्सर्जन करेगा। निम्नलिखित समाधान मनमानी विशेषताओं को संग्रहीत करने के लिए काम करता है।

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

इसके अलावा, यदि आप चाहते हैं कि यह आपके डेटाफ़्रेम की प्रतियों में बनी रहे, तो आपको करने की आवश्यकता है pd.DataFrame._metadata += ["meta"]। ध्यान दें कि यह हिस्सा पंडों का एक गुण है, न कि आपके विशिष्ट
डेटाफ्रेम

यह तरीका df.metaकिसी चेतावनी के रूप में काम नहीं करेगा क्योंकि पंडों ने नए कॉलम को इस तरह से उत्पन्न नहीं होने दिया।
anishtain4

@ aishtain4, मैंने अभी पंडों के साथ इसका परीक्षण किया 25.1 (रिलीज़ ~ 2 सप्ताह पहले) और यह कोड अभी भी मेरे लिए काम करता है। यह चेतावनी नहीं है क्योंकि df.metaएक SimpleNamespace ट्रिगर है। पंडों की कोशिश नहीं होगी और इससे एक स्तंभ का निर्माण होगा।
bscan

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

इस पर काफी देर से आने पर, मुझे लगा कि अगर I / O पर लगातार बने रहने के लिए मेटाडेटा की जरूरत है तो यह मददगार हो सकता है। H5io नामक एक अपेक्षाकृत नया पैकेज है जिसे मैं इसे पूरा करने के लिए उपयोग कर रहा हूं।

यह आपको कुछ सामान्य प्रारूपों के लिए HDF5 से एक त्वरित पढ़ने / लिखने की अनुमति देना चाहिए, उनमें से एक डेटाफ्रेम है। इसलिए, उदाहरण के लिए, आप एक शब्दकोश में डेटाफ़्रेम डाल सकते हैं और मेटाडेटा को शब्दकोश में फ़ील्ड के रूप में शामिल कर सकते हैं। उदाहरण के लिए:

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

जैसा कि @choldgraf ने उल्लेख किया है कि मैंने ज़ार्रे पाया है डेटा को तुलना करने और कई डेटाफ़्रेम के बीच परिणामों की साजिश रचने के लिए को मेटाडेटा संलग्न करने के लिए एक उत्कृष्ट उपकरण माना है।

मेरे काम में, हम अक्सर कई फर्मवेयर संशोधन और विभिन्न परीक्षण परिदृश्यों के परिणामों की तुलना कर रहे हैं, इस जानकारी को जोड़ना इस रूप में सरल है:

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']

जब भी आप इसे पास करेंगे यह विशेषता हमेशा आपके फ्रेम से चिपकी रहेगी!


ध्यान दें कि अटार्स प्रयोगात्मक है और चेतावनी के बिना बदल सकता है, लेकिन यह एक बहुत ही सरल समाधान है। मुझे आश्चर्य है कि अगर attrs नए डेटाफ़्रेम को स्थानांतरित करता है।
लिक्विजेनियस

दुर्भाग्य से, attrs नए डेटाफ्रेम में कॉपी नहीं किए जाते हैं :(
एडम

1

मैं एक ही मुद्दा था और मेटाडाटा के साथ एक शब्दकोश से एक नया, छोटे DF बनाने का एक वैकल्पिक हल:

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

इस dfMeta को अचार आदि में अपने मूल DF के साथ सहेजा जा सकता है

अचार फ़ाइल में कई वस्तुओं को सहेजना और लोड करना देखें ? (लुत्ज़ का उत्तर) अचार का उपयोग करके कई डेटाफ़्रेम को सहेजने और पुनर्प्राप्त करने पर उत्कृष्ट उत्तर के लिए

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.