2013-08-01 2 views
8

मुझे डेटाफ्रेम में मूल्यों को बदलने में समस्या आ रही है। मैं हल करने की आवश्यकता के बारे में भी सलाह देना चाहता हूं और हल करने के लिए पांडा का उपयोग करने का उचित तरीका। मैं दोनों पर मदद की सराहना करता हूं। मेरे पास एक फ़ाइल है जिसमें वक्ताओं को ऑडियो फ़ाइलों की मिलान करने की जानकारी है। फ़ाइल कुछ ऐसा दिखती है:पांडा डेटाफ्रेम में मूल्य बदलना काम करता है

wave_path spk_name spk_example# score mark comments isUsed 
190 122_65_02.04.51.800.wav  idoD idoD 88 NaN  NaN  False 
191 121_110_20.17.27.400.wav idoD idoD 87 NaN  NaN  False 
192 121_111_00.34.57.300.wav idoD idoD 87 NaN  NaN  False 
193 103_31_18.59.12.800.wav  idoD idoD_0 99 HIT  VP False 
194 131_101_02.08.06.500.wav idoD idoD_0 96 HIT  VP False 

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

मैंने पांडों का उपयोग करके उस प्रक्रिया को कार्यान्वित करने के बारे में बहुत कुछ सोचा (यह नियमित पायथन में लागू करना काफी आसान है, लेकिन इसमें बहुत लूपिंग और डेटा संरचना होगी जो मेरा अनुमान प्रक्रिया को धीमा कर देगा, और मैं भी मैं पांडा क्षमताओं को अधिक गहराई से सीखने के लिए इस प्रक्रिया का उपयोग कर रहा हूं)

मैं निम्नलिखित समाधान के साथ बाहर आया। तैयारी के चरणों के रूप में, मैं स्पीकर नाम से समूहबद्ध करूंगा और set_index विधि द्वारा फ़ाइल नाम को इंडेक्स के रूप में सेट करूँगा। मैं फिर groupbyObj पर फिर से शुरू करूंगा और गणना फ़ंक्शन लागू करूंगा, जो चयनित स्पीकर और फ़ाइलों को उपयोग के रूप में चिह्नित करने के लिए वापस कर देगा।

फिर मैं फ़ाइलों पर पुन: सक्रिय हो जाऊंगा और उन्हें इस्तेमाल के रूप में चिह्नित करूँगा (यह तेज़ और सरल होगा क्योंकि मैं उन्हें पहले से इंडेक्स के रूप में सेट करता हूं), और जब तक मैं गणना समाप्त नहीं करता तब तक।

सबसे पहले, मुझे इस समाधान के बारे में निश्चित नहीं है, इसलिए मुझे अपने विचारों को बताने में संकोच न करें। अब, मैं इस को लागू करने की कोशिश की है, और मुसीबत में मिल गया:

सबसे पहले मैं फ़ाइल नाम द्वारा अनुक्रमित है, यहाँ कोई समस्या नहीं:

In [53]: 

    marked_results['isUsed'] = False 
    ind_res = marked_results.set_index('wave_path') 
    ind_res.head() 

Out[53]: 
    spk_name spk_example# score mark comments isUsed 
    wave_path      
    103_31_18.59.12.800.wav  idoD idoD 99 HIT  VP False 
    131_101_02.08.06.500.wav  idoD idoD 99 HIT  VP False 
    144_35_22.46.38.700.wav  idoD idoD 96 HIT  VP False 
    41_09_17.10.11.700.wav  idoD idoD 93 HIT  TEST False 
    122_188_03.19.20.400.wav  idoD idoD 93 NaN  NaN  False 

तब मैं कोई फ़ाइल चुनें और जाँच की है कि मैं प्रविष्टियों प्रासंगिक उस फ़ाइल में:

In [54]: 

    example_file = ind_res.index[0]; 
    ind_res.ix[example_file] 

Out[54]: 
    spk_name spk_example# score mark comments isUsed 
    wave_path      
    103_31_18.59.12.800.wav idoD idoD 99 HIT  VP False 
    103_31_18.59.12.800.wav idoD idoD_0 99 HIT  VP False 
    103_31_18.59.12.800.wav idoD idoD_1 97 HIT  VP False 
    103_31_18.59.12.800.wav idoD idoD_2 95 HIT  VP False 

अब यहां भी समस्याएं हैं। तब मैं सही पर उस फ़ाइल के लिए isUsed मूल्य बदलने की कोशिश की, और कहा कि जहां मैं इस समस्या मिला:

In [56]: 

    ind_res.ix[example_file]['isUsed'] = True 
    ind_res.ix[example_file].isUsed = True 
    ind_res.ix[example_file] 
Out[56]: 
    spk_name spk_example# score mark comments isUsed 
    wave_path      
    103_31_18.59.12.800.wav idoD idoD 99 HIT  VP False 
    103_31_18.59.12.800.wav idoD idoD_0 99 HIT  VP False 
    103_31_18.59.12.800.wav idoD idoD_1 97 HIT  VP False 
    103_31_18.59.12.800.wav idoD idoD_2 95 HIT  VP False 

तो, आप समस्या को देखते हैं। कुछ भी नहीं बदला। मैं क्या गलत कर रहा हूं? ऊपर वर्णित समस्या को पांडा का उपयोग करके हल किया जाना चाहिए?

और यह भी: 1. मैं समूह समूह द्वारा किसी विशिष्ट समूह से कैसे संपर्क कर सकता हूं? बीसीजेड मैंने सोचा था कि फाइलों को अनुक्रमित, फ़ाइल द्वारा समूहित करने के बजाय, और उस समूहबी ओबीजे का उपयोग करके इसकी सभी घटनाओं में एक बदलते फ़ंक्शन को लागू करने के बजाय। लेकिन मुझे किसी विशिष्ट समूह से संपर्क करने और समूह के नाम को पैरामीटर के रूप में पारित करने और सभी समूहों पर कॉल करने का कोई तरीका नहीं मिला और फिर उनमें से केवल एक पर कार्य करना मुझे "सही" नहीं लग रहा था। एक दृश्य या एक प्रति:

मुझे आशा है कि यह लंबे समय के लिए नहीं है ... :)

+0

आप एक प्रति, '' .ix [example_file, 'isUsed'] '' देख संशोधित कर रहे हैं यहाँ कुछ करना चाहता हूँ: http: // pandas.pydata.org/pandas-docs/dev/indexing.html#returning-a-view-versus-a-copy – Jeff

उत्तर

17

अनुक्रमण पांडा वस्तुओं दो मौलिक रूप से अलग वस्तुओं लौट सकते हैं।

तो mask एक बुनियादी टुकड़ा है, तो df.ix[mask]df की एक दृश्य देता है। दृश्य मूल अंतर्निहित डेटा (df) के समान अंतर्निहित डेटा साझा करते हैं। तो दृश्य को संशोधित करने से, मूल वस्तु को भी संशोधित किया जाता है।

तो mask इस तरह के सूचकांकों की एक मनमाना अनुक्रम के रूप में कुछ और अधिक जटिल, है, तो df.ix[mask] कुछ पंक्तियों की एक प्रतिलिपिdf में वापस आती है। कॉपी को संशोधित करने से मूल पर कोई प्रभाव नहीं पड़ता है।

आपके मामले में, चूंकि पंक्तियां wave_path साझा करती हैं, मनमाने ढंग से स्थानों पर होती हैं, ind_res.ix[example_file] एक प्रतिलिपि देता है। तो

ind_res.ix[example_file]['isUsed'] = True 

ind_res पर कोई प्रभाव नहीं है।

इसके बजाय, आप

ind_res.ix[example_file, 'isUsed'] = True 

का उपयोग ind_res संशोधित करने के लिए कर सकता है। हालांकि, groupby सुझाव के लिए नीचे देखें जो मुझे लगता है कि आप वास्तव में जो चाहते हैं उसके करीब हो सकते हैं।

जेफ पहले से ही प्रदान की गई है एक link to the Pandas docs जिनके अनुसार

जब डेटा पर एक दृश्य दिया जाता है के बारे में नियम पूरी तरह NumPy पर निर्भर हैं।

यहां (जटिल) rules which describe when a view or copy is returned हैं। असल में, हालांकि, नियम यह है कि अगर सूचक अंतर्निहित सरणी के नियमित रूप से दूरी वाले टुकड़े का अनुरोध कर रहा है तो एक दृश्य वापस कर दिया जाता है, अन्यथा एक प्रति (आवश्यकता से बाहर) लौटा दी जाती है।


यहां एक साधारण उदाहरण है जो मूल टुकड़ा का उपयोग करता है। एक दृश्य df.ix द्वारा दिया जाता है, ताकि संशोधित subdfdf को संशोधित करता है और साथ ही:

import pandas as pd 
import numpy as np 

df = pd.DataFrame(np.arange(12).reshape(4,3), 
     columns=list('ABC'), index=[0,1,2,3]) 

subdf = df.ix[0] 
print(subdf.values) 
# [0 1 2] 
subdf.values[0] = 100 
print(subdf) 
# A 100 
# B  1 
# C  2 
# Name: 0, dtype: int32 

print(df)   # df is modified 
#  A B C 
# 0 100 1 2 
# 1 3 4 5 
# 2 6 7 8 
# 3 9 10 11 

यहाँ एक सरल उदाहरण है जो "फैंसी अनुक्रमण" (मनमाना पंक्ति नहीं चुनी गई) का उपयोग करता है। एक प्रति df.ix द्वारा वापस की जाती है। तो subdf संशोधित df को प्रभावित नहीं करता है।

df = pd.DataFrame(np.arange(12).reshape(4,3), 
     columns=list('ABC'), index=[0,1,0,3]) 

subdf = df.ix[0] 
print(subdf.values) 
# [[0 1 2] 
# [6 7 8]] 

subdf.values[0] = 100 
print(subdf) 
#  A B C 
# 0 100 100 100 
# 0 6 7 8 

print(df)   # df is NOT modified 
# A B C 
# 0 0 1 2 
# 1 3 4 5 
# 0 6 7 8 
# 3 9 10 11 

सूचना दो उदाहरण के बीच फर्क सिर्फ इतना है कि पहले जहां एक दृश्य दिया जाता है में, सूचकांक था [0,1,2,3], दूसरा, जहां एक प्रति दिया जाता है जबकि , सूचकांक [0,1,0,3] था।

चूंकि हम पंक्तियों का चयन करते हैं जहां सूचकांक 0 है, पहले उदाहरण में, हम इसे मूल टुकड़े के साथ कर सकते हैं। दूसरे दूसरे उदाहरण में, पंक्तियों जहां सूचकांक 0 बराबर है मनमानी स्थानों पर दिखाई दे सकता है, इसलिए एक प्रति वापस लौटा दी जानी चाहिए।


पांडा/NumPy टुकड़ा करने की क्रिया की सूक्ष्मता के बारे में पर ranted होने के बावजूद, मैं सच में नहीं लगता है कि

ind_res.ix[example_file, 'isUsed'] = True 

क्या आप अंततः के लिए देख रहे है। आप शायद अधिक की तरह

import pandas as pd 
import numpy as np 

df = pd.DataFrame(np.arange(12).reshape(4,3), 
        columns=list('ABC')) 
df['A'] = df['A']%2 
print(df) 
# A B C 
# 0 0 1 2 
# 1 1 4 5 
# 2 0 7 8 
# 3 1 10 11 

def calculation(grp): 
    grp['C'] = True 
    return grp 

newdf = df.groupby('A').apply(calculation) 
print(newdf) 

जो पैदावार

A B  C 
0 0 1 True 
1 1 4 True 
2 0 7 True 
3 1 10 True 
+1

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

+0

समूहबी का उपयोग कर सुझाव काम नहीं कर रहा है। 'IsUsed' कॉलम 'गणना' फ़ंक्शन के अंदर बदल दिया गया है, लेकिन बाहर डेटाफ्रेम बदल नहीं रहा है। तुम जानते हो क्यों? क्या यह समूह डीएफ की प्रतियां भी हो सकता है? @unut – idoda

+0

समूहबी का उपयोग कर सुझाव काम नहीं कर रहा है। 'IsUsed' कॉलम 'गणना' फ़ंक्शन के अंदर बदल दिया गया है, लेकिन बाहर डेटाफ्रेम बदल नहीं रहा है। तुम जानते हो क्यों? क्या यह समूह डीएफ की प्रतियां भी हो सकता है? – idoda

संबंधित मुद्दे