कन्वर्ट पांडा श्रृंखला DataFrame करने के लिए


92

मेरे पास पंडों की श्रृंखला sf है:

email
email1@email.com    [1.0, 0.0, 0.0]
email2@email.com    [2.0, 0.0, 0.0]
email3@email.com    [1.0, 0.0, 0.0]
email4@email.com    [4.0, 0.0, 0.0]
email5@email.com    [1.0, 0.0, 3.0]
email6@email.com    [1.0, 5.0, 0.0]

और मैं इसे निम्नलिखित DataFrame में बदलना चाहूंगा:

index | email             | list
_____________________________________________
0     | email1@email.com  | [1.0, 0.0, 0.0]
1     | email2@email.com  | [2.0, 0.0, 0.0]
2     | email3@email.com  | [1.0, 0.0, 0.0]
3     | email4@email.com  | [4.0, 0.0, 0.0]
4     | email5@email.com  | [1.0, 0.0, 3.0]
5     | email6@email.com  | [1.0, 5.0, 0.0]

मुझे ऐसा करने का एक तरीका मिला, लेकिन मुझे संदेह है कि यह अधिक कुशल है:

df1 = pd.DataFrame(data=sf.index, columns=['email'])
df2 = pd.DataFrame(data=sf.values, columns=['list'])
df = pd.merge(df1, df2, left_index=True, right_index=True)

4
पांडा के अधिक हाल के संस्करणों में, यह एक reset_indexकॉल के साथ प्राप्त किया जा सकता है
1995 पर cs95

जवाबों:


136

2 अस्थाई dfs बनाने के बजाय, आप डेटाफ़ॉर्म कंस्ट्रक्टर का उपयोग करके इन्हें एक पैरामेड के रूप में पारित कर सकते हैं:

pd.DataFrame({'email':sf.index, 'list':sf.values})

Df बनाने के बहुत सारे तरीके हैं, डॉक्स देखें


एक और बढ़िया विकल्प यह है कि यदि आपकी श्रृंखला में एक ही कुल्हाड़ी हो, तो उसे संक्षिप्त करेंpd.concat([sf.index, sf.values], axis=1)
लॉरेन

63

to_frame () :

निम्नलिखित श्रृंखला के साथ शुरू, df:

email
email1@email.com    A
email2@email.com    B
email3@email.com    C
dtype: int64

मैं श्रृंखला को DataFrame में बदलने के लिए to_frame का उपयोग करता हूं:

df = df.to_frame().reset_index()

    email               0
0   email1@email.com    A
1   email2@email.com    B
2   email3@email.com    C
3   email4@email.com    D

अब आपको केवल कॉलम नाम का नाम बदलना है और इंडेक्स कॉलम को नाम देना है:

df = df.rename(columns= {0: 'list'})
df.index.name = 'index'

आपका DataFrame आगे के विश्लेषण के लिए तैयार है।

अद्यतन: मैं अभी इस लिंक पर आया हूं, जहां उत्तर आश्चर्यजनक रूप से मेरे लिए समान हैं।


1
series_obj.to_frame()काम करता है! मैं इस वर्ग के प्रकार<class 'pandas.core.frame.DataFrame'>
जॉनी झांग

1
to_frame().reset_index()सिर्फ के बजाय उपयोग क्यों करें reset_index? तुम भी बस कर सकते हैंreset_index(name='list')
dumbledad

17

Series.reset_indexnameतर्क के साथ

अक्सर उपयोग का मामला सामने आता है जहां एक श्रृंखला को एक DataFrame को बढ़ावा देने की आवश्यकता होती है। लेकिन अगर श्रृंखला का कोई नाम नहीं है, तो reset_indexपरिणाम कुछ इस तरह होगा,

s = pd.Series([1, 2, 3], index=['a', 'b', 'c']).rename_axis('A')
s

A
a    1
b    2
c    3
dtype: int64

s.reset_index()

   A  0
0  a  1
1  b  2
2  c  3

जहाँ आप देखते हैं कि कॉलम का नाम "0" है। हम इसे एक nameपैरामीटर निर्दिष्ट कर ठीक कर सकते हैं ।

s.reset_index(name='B')

   A  B
0  a  1
1  b  2
2  c  3

s.reset_index(name='list')

   A  list
0  a     1
1  b     2
2  c     3

Series.to_frame

यदि आप एक स्तंभ में सूचकांक को बढ़ावा दिए बिना एक DataFrame बनाना चाहते हैं Series.to_frame, तो इस उत्तर में दिए गए सुझाव के अनुसार उपयोग करें । यह एक नाम पैरामीटर का भी समर्थन करता है।

s.to_frame(name='B')

   B
A   
a  1
b  2
c  3

pd.DataFrame निर्माता

आप ऐसा भी कर सकते हैं जैसे Series.to_frameएक columnsपरम को निर्दिष्ट करके :

pd.DataFrame(s, columns=['B'])

   B
A   
a  1
b  2
c  3

मैं सोच रहा था कि कोई इसका उपयोग क्यों कर सकता to_frameहै reset_index, लेकिन क्या कभी दोनों का उपयोग करने का एक अच्छा कारण है? यहाँ
dumbledad

@ डंबल्डड ज्यादातर उपयोगिता। यदि आप इंडेक्स के साथ एक एकल कर्नल डेटाफ्रेम चाहते हैं, तो to_frame () का उपयोग करें। यदि आपको दो कॉलम की जरूरत है (एक श्रृंखला सूचकांक से और दूसरा श्रृंखला मानों से ही), तो reset_index () के साथ जाएं।
cs95

और क्या होगा अगर मैं सीरीज़ को डेटाफ़्रेम के साथ सीरीज़ इंडेक्स में बदलना चाहता हूं, जिसका इस्तेमाल डेटाफ़्रेम कॉलम नाम (यानी ट्रांसपोज़्ड) के रूप में किया जाता है? to_frameऐसा करने के लिए कोई तर्क नहीं लगता है। धन्यवाद।
चकित

@Confounded use to_frame ()। T इसे स्थानांतरित करने के लिए
cs95

17

एक पंक्ति का उत्तर होगा

myseries.to_frame(name='my_column_name')

या

myseries.reset_index(drop=True, inplace=True)  # As needed

4

Series.to_frameएक में परिवर्तित करने के लिए इस्तेमाल किया जा सकता Seriesहै DataFrame

# The provided name (columnName) will substitute the series name
df = series.to_frame('columnName')

उदाहरण के लिए,

s = pd.Series(["a", "b", "c"], name="vals")
df = s.to_frame('newCol')
print(df)

   newCol
0    a
1    b
2    c

1

संभवतः ऐसा करने के लिए एक गैर-पाइथोनिक तरीके के रूप में वर्गीकृत किया गया है, लेकिन यह आपको एक पंक्ति में वांछित परिणाम देगा:

new_df = pd.DataFrame(zip(email,list))

परिणाम:

               email               list
0   email1@email.com    [1.0, 0.0, 0.0]
1   email2@email.com    [2.0, 0.0, 0.0]
2   email3@email.com    [1.0, 0.0, 0.0]
3   email4@email.com    [4.0, 0.0, 3.0]
4   email5@email.com    [1.0, 5.0, 0.0]
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.