पंडों का डेटाफ़्रेम सूची की सूची में


115

पंडों के डेटाफ्रेम में सूचियों की सूची को बदलना आसान है:

import pandas as pd
df = pd.DataFrame([[1,2,3],[3,4,5]])

लेकिन मैं डीएफ को सूचियों की सूची में कैसे बदलूं?

lol = df.what_to_do_now?
print lol
# [[1,2,3],[3,4,5]]

जवाबों:


177

आप अंतर्निहित सरणी तक पहुँच सकते हैं और इसकी tolistविधि को कॉल कर सकते हैं :

>>> df = pd.DataFrame([[1,2,3],[3,4,5]])
>>> lol = df.values.tolist()
>>> lol
[[1L, 2L, 3L], [3L, 4L, 5L]]

क्यों Lआउटपुट में जोड़ रहे हैं ?
कुणाल व्यास

1
L का अर्थ है लंबा, जैसा कि int के विपरीत है।
user48956


1
ध्यान दें, यह कॉलम ऑर्डरिंग को संरक्षित नहीं करता है। तो उस के लिए बाहर देखो
रसेल लेगो

3
ऐसा कोई कारण नहीं है कि यह कॉलम ऑर्डरिंग को संरक्षित नहीं करेगा।
योहान ओबदिया

15

यदि डेटा में कॉलम और इंडेक्स लेबल हैं जिन्हें आप संरक्षित करना चाहते हैं, तो कुछ विकल्प हैं।

उदाहरण डेटा:

>>> df = pd.DataFrame([[1,2,3],[3,4,5]], \
       columns=('first', 'second', 'third'), \
       index=('alpha', 'beta')) 
>>> df
       first  second  third
alpha      1       2      3
beta       3       4      5

tolist()विधि अन्य उत्तर में वर्णित उपयोगी है लेकिन पैदावार केवल कोर डेटा - अपनी आवश्यकताओं पर निर्भर करता है के लिए पर्याप्त नहीं हो सकता है,।

>>> df.values.tolist()
[[1, 2, 3], [3, 4, 5]]

एक तरीका यह है कि DataFramejson का उपयोग करके df.to_json()इसे फिर से पार्स करें। यह बोझिल है लेकिन इसके कुछ फायदे हैं, क्योंकि to_json()विधि के कुछ उपयोगी विकल्प हैं।

>>> df.to_json()
{
  "first":{"alpha":1,"beta":3},
  "second":{"alpha":2,"beta":4},"third":{"alpha":3,"beta":5}
}

>>> df.to_json(orient='split')
{
 "columns":["first","second","third"],
 "index":["alpha","beta"],
 "data":[[1,2,3],[3,4,5]]
}

बोझिल लेकिन उपयोगी हो सकता है।

अच्छी खबर यह है कि स्तंभों और पंक्तियों की सूची बनाना बहुत सरल है:

>>> columns = [df.index.name] + [i for i in df.columns]
>>> rows = [[i for i in row] for row in df.itertuples()]

यह प्रदान करता है:

>>> print(f"columns: {columns}\nrows: {rows}") 
columns: [None, 'first', 'second', 'third']
rows: [['alpha', 1, 2, 3], ['beta', 3, 4, 5]]

यदि Noneसूचकांक का नाम परेशान है, तो इसका नाम बदलें:

df = df.rename_axis('stage')

फिर:

>>> columns = [df.index.name] + [i for i in df.columns]
>>> print(f"columns: {columns}\nrows: {rows}") 

columns: ['stage', 'first', 'second', 'third']
rows: [['alpha', 1, 2, 3], ['beta', 3, 4, 5]]

1
यदि आपके पास एक बहुस्तरीय सूचकांक है, तो इंडेक्स ट्यूपल उत्पन्न पंक्तियों का पहला तत्व होगा। इसे विभाजित करने के लिए आपको एक और कदम की आवश्यकता होगी।
Konstantin

यह उपयोग करने के लिए DataFrame.itertuples()या DataFrame.to_records()इस सब के लिए आसान नहीं होगा ?
एएमसी

@AMC शायद, मुझे नहीं पता, शायद? पोंट सर्टिफिकेट के बजाय, अपने खुद के जवाब में उस विचार का एक उचित इलाज क्यों न जोड़ें?
एंड्रयू ई

@AndrewE एह, यह अभी भी मौजूदा जवाबों पर चर्चा और सुधार के लायक है।
एएमसी

5

मुझे नहीं पता कि यह आपकी आवश्यकताओं के अनुरूप होगा, लेकिन आप यह भी कर सकते हैं:

>>> lol = df.values
>>> lol
array([[1, 2, 3],
       [3, 4, 5]])

यह ndarray मॉड्यूल से केवल एक खसरा सरणी है, जो आपको सभी सामान्य सुन्न सरणी चीजें करने देता है।


1
प्लस 1. व्यवहार में , कई बार NumPy सरणी को सूचियों की सूची में बदलने की आवश्यकता नहीं होती है।
19

5

मैं सूचकांक को संरक्षित करना चाहता था, इसलिए मैंने इस समाधान के मूल उत्तर को अनुकूलित किया:

list_df = df.reset_index().values.tolist()

अब आप इसे कहीं और पेस्ट कर सकते हैं (जैसे स्टैक ओवरफ्लो प्रश्न में पेस्ट करने के लिए) और बाद में इसे फिर से बनाएँ:

pd.Dataframe(list_df, columns=['name1', ...])
pd.set_index(['name1'], inplace=True)


1

नोट: मैंने स्टैक ओवरफ्लो पर कई मामलों को देखा है जहां एक पांडस श्रृंखला या डेटाफ्रेम को एक न्यूम सरणी या सादे पायथन सूची में परिवर्तित करना पूरी तरह से आवश्यक है। यदि आप लाइब्रेरी में नए हैं, तो डबल-चेकिंग पर विचार करें कि क्या आपके लिए आवश्यक कार्यक्षमता पहले से ही उन पंडों की वस्तुओं द्वारा पेश की गई है।

@Jpp द्वारा टिप्पणी उद्धृत करने के लिए :

व्यवहार में , अक्सर NumPy सरणी को सूचियों की सूची में परिवर्तित करने की आवश्यकता नहीं होती है।


यदि कोई पांडस डेटाफ़्रेम / सीरीज काम नहीं करेगा, तो आप बिल्ट-इन DataFrame.to_numpyऔर Series.to_numpyविधियों का उपयोग कर सकते हैं ।


1
यह उत्तर आपकी अपनी मान्यताओं से थोड़ा अधिक प्रतिनिधित्व करता है। और काफी स्पष्ट रूप से, यह थोड़ा शर्मनाक है। डेटाफ़्रेम को सूची / सरणी में बदलने के लिए पूरी तरह से मान्य कारण हैं, एक उन्नत उपयोगकर्ता को निश्चित रूप से पता होगा।
निकोलस ग्रीवाइस

@ निकोलसगर्वाइस यह थोड़ा बहुत हो सकता है, हाँ, मैं इसे कम सामान्य करने के लिए संपादित करूँगा। डेटाफ़्रेम को सूची / सरणी में बदलने के लिए पूरी तरह से मान्य कारण हैं , मेरा जवाब वास्तव में इसके विपरीत कुछ भी नहीं कहता है। एक उन्नत उपयोगकर्ता निश्चित रूप से जानता होगा। मुझे उस जाब की बात दिखाई नहीं दे रही है। मैंने यह जवाब नोट करने के बाद लिखा है कि कई लोग श्रृंखला को ndarrays या सूचियों में परिवर्तित कर रहे थे, और ndarrays को सूचियों में, केवल इसलिए कि वे इस बात से अनजान थे कि उन वस्तुओं को कौन से संचालन का समर्थन है।
एएमसी

मैं बहुत स्पष्ट मामलों का जिक्र कर रहा हूं, जैसे करना for elem in some_series.values.tolist():क्योंकि वे नहीं जानते कि आप एक श्रृंखला के तत्वों पर पुनरावृत्ति कर सकते हैं। मुझे यकीन नहीं है कि इस उत्तर के बारे में इतना भयानक क्या है।
एएमसी

0

यह बहुत सरल है:

import numpy as np

list_of_lists = np.array(df)

यह कैसे उपयोग करने से अलग है DataFrame.valuesया DataFrame.to_numpy()? इस तथ्य पर कभी ध्यान न दें कि यह एक साधारण सरणी बनाता है, न कि एक सादा पायथन सूची।
एएमसी

-1

हम DataFrame.iterrows () फ़ंक्शन का उपयोग कर दिए गए डेटाफ्रेम की पंक्तियों में से प्रत्येक पर पुनरावृति कर सकते हैं और प्रत्येक पंक्ति के डेटा से एक सूची का निर्माण कर सकते हैं:

# Empty list 
row_list =[] 

# Iterate over each row 
for index, rows in df.iterrows(): 
    # Create list for the current row 
    my_list =[rows.Date, rows.Event, rows.Cost] 

    # append the list to the final list 
    row_list.append(my_list) 

# Print 
print(row_list) 

हम दिए गए डेटा फ़्रेम की प्रत्येक पंक्ति को एक सूची में सफलतापूर्वक निकाल सकते हैं


यह एक अच्छा विचार नहीं है, df.iterrows का उपयोग करने से बचने की कोशिश करें क्योंकि यह df बड़ा होने के बाद एक बार पैटर्न-विरोधी और धीमा होता है: stackoverflow.com/questions/16476924/…
Derek O
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.