मुझे मल्टी इंडेक्स के set_levels का उपयोग करते हुए एक समस्या का सामना करना पड़ा

from io import StringIO

txt = '''Name,Height,Age
"",Metres,""
A,-1,25
B,95,-1'''

df = pd.read_csv(StringIO(txt),header=[0,1],na_values=['-1',''])

df.columns = df.columns.set_levels(df.columns.get_level_values(level=1).str.replace('Un.*',''),level=1)

     Name Height   Age
   Metres             
0      A    NaN  25.0
1      B   95.0   NaN

अगर मैं फिर से वही कमांड चलाता हूं

df.columns = df.columns.set_levels(df.columns.get_level_values(level=1).str.replace('Un.*',''),level=1)

  Name Height   Age
       Metres      
0    A    NaN  25.0
1    B   95.0   NaN

अब इसका अपेक्षित परिणाम मिल रहा है। ऐसा व्यवहार क्यों है? क्या यह संभव है कि पहली बार में ही लेबलों को क्रमबद्ध न किया जाए?

3
Bharath 2 जिंदा 2018, 15:39

2 जवाब

सबसे बढ़िया उत्तर

मैं पूरी तरह से समझ नहीं पा रहा हूं कि ऐसा क्यों होता है लेकिन मैंने पाया कि समस्या का कारण क्या है और इसका समाधान क्या है:

यदि हम कॉलम लेबल्स को देखें तो हमें कुछ अजीब दिखाई दे सकता है

>>> df = pd.read_csv(StringIO(txt),header=[0,1],na_values=['-1',''])
>>> df.columns
MultiIndex(levels=[['Age', 'Height', 'Name'], ['Metres', 'Unnamed: 0_level_1', 'Unnamed: 2_level_1']],
           labels=[[2, 1, 0], [1, 0, 2]])

दूसरे स्तर के सूचकांक पहली परत के सूचकांकों से मेल नहीं खाते। और जब आप स्ट्रिंग्स को प्रतिस्थापित करते हैं तो आप उस ऐरे पर करते हैं जो सही क्रम में है:

>>> df.columns.get_level_values(level=1)
Index(['Unnamed: 0_level_1', 'Metres', 'Unnamed: 2_level_1'], dtype='object')

लेकिन आप केवल अनुक्रमित करके गलत क्रम में सरणी प्राप्त कर सकते हैं:

>>> df.columns.levels[1]
Index(['Metres', 'Unnamed: 0_level_1', 'Unnamed: 2_level_1'], dtype='object')

तो अनाम सूचकांकों को हटाने के लिए:

>>> df.columns = df.columns.set_levels(df.columns.levels[1].str.replace('Un.*', ''), level=1)
>>> df

  Name Height   Age
       Metres
0    A    NaN  25.0
1    B   95.0   NaN

हालांकि मैं किसी के लिए यह बताना चाहूंगा कि get_ और set_levels का उपयोग करने का यह व्यवहार क्यों है।

2
Jurgy 2 जिंदा 2018, 17:19

लगता है जैसे आपको चाहिए, यह आपकी मूल संरचना के आधार को संशोधित करेगा

df.rename(columns=lambda x : '' if 'Unnamed' in x else x , level=1)
Out[106]: 
  Name Height   Age
       Metres      
0    A    NaN  25.0
1    B   95.0   NaN
1
BENY 2 जिंदा 2018, 22:38