मैं कई स्तंभों के साथ एक पांडा डेटाफ्रेम उत्पन्न करना चाहता हूं, उनमें से प्रत्येक में अधिक से अधिक उप-कॉलम हैं। फिर मैं इसे एक सीएसवी में लिखना चाहता हूं और इंडेक्सिंग को सही बनाए रखते हुए इसे पढ़ना चाहता हूं।

यहाँ एक उदाहरण है:

col_1 = pd.MultiIndex.from_tuples([ ('Numbers', 'one'), ('Numbers','two')] )
col_2 = pd.MultiIndex.from_tuples([ ('Letters', 'A'), ('Letters', 'B'), ('Letters', 'C') ] )
num_data = [[0,1],[2,3]]
num_df = pd.DataFrame(num_data, columns=col_1)
let_data = [['a','b','c'],['d','e','f']]
let_df = pd.DataFrame(let_data, columns=col_2)
tot_df = pd.concat([let_df,num_df], axis=1)

जो देता है:

  Letters       Numbers    
        A  B  C     one two
0       a  b  c       0   1
1       d  e  f       2   3

Q1: क्या ऐसा करने का कोई बेहतर तरीका है? मैं बिना किसी कॉन्सट के पूरी तालिका को कैसे परिभाषित कर सकता हूं? Q2: मैं एक पंक्ति से मान कैसे निकालूं? जब मैं एक लाइन निकालने की कोशिश करता हूं, तो मैं मुश्किल में पड़ जाता हूं, खासकर जब मैं टाइप करता हूं

tot_df.loc[tot_df['Letters','A'] == ['a'] ]

और ऐसा इसलिए है क्योंकि "tot_df['Letters','A'].values" एक सूची ['a', 'd'] के बजाय एक सरणी = ['a' 'd'] लौटाता है।

Q3: अब प्रिंटिंग/रीडिंग भाग पर चलते हुए, मैं आमतौर पर to_csv () और read_csv () विधियों का उपयोग करता हूं, लेकिन मुझे निम्नलिखित के रूप में एक अनफोल्डेड 1D हेडर मिलता है:

tot_df.to_csv('multi_col.csv')
read_df = pd.read_csv('multi_col.csv', index_col = 0 )
read_df

     Letters Letters.1 Letters.2 Numbers Numbers.1
NaN        A         B         C     one       two
 0.0       a         b         c       0         1
 1.0       d         e         f       2         3

क्या आप में से कोई बेहतर समाधान सुझा सकता है?

शुक्रिया

1
Marco Di Gennaro 19 पद 2018, 16:22

1 उत्तर

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

Q1: आप एक साथ टुपल्स की सूची में शामिल हो सकते हैं और सूची समझ द्वारा सूची में डेटा भी जोड़ सकते हैं और केवल एक बार DataFrame कंस्ट्रक्टर को कॉल कर सकते हैं:

col_1 = [('Numbers', 'one'), ('Numbers','two')]
col_2 = [('Letters', 'A'), ('Letters', 'B'), ('Letters', 'C')]
num_data = [[0,1],[2,3]]
let_data = [['a','b','c'],['d','e','f']]

tot_df = pd.DataFrame([a + b for a, b in zip(num_data, let_data)], 
                      columns=pd.MultiIndex.from_tuples(col_1 + col_2))
print (tot_df)
  Numbers     Letters      
      one two       A  B  C
0       0   1       a  b  c
1       2   3       d  e  f

Q2: MultiIndex द्वारा फ़िल्टर के लिए tuples का उपयोग करें, जटिल चयन के लिए स्लाइसर:

print (tot_df.loc[tot_df[('Letters','A')] == 'a'])
  Numbers     Letters      
      one two       A  B  C
0       0   1       a  b  c

Q3: डिफॉल्ट इंडेक्स को हटाने के लिए फ़ाइल ऐड पैरामीटर index=False लिखने के लिए और Multiindex की स्थिति की सूची के साथ पैरामीटर जोड़ें header पढ़ने के लिए - फ़ाइल की पहली 2 पंक्तियाँ:

tot_df.to_csv('multi_col.csv', index=False)
read_df = pd.read_csv('multi_col.csv', header= [0,1])
print (read_df)
  Numbers     Letters      
      one two       A  B  C
0       0   1       a  b  c
1       2   3       d  e  f
0
jezrael 19 पद 2018, 16:48