पांडा डेटा फ्रेम को श्रृंखला में बदलें


99

पंडों के लिए मैं कुछ नया हूं। मेरे पास एक पांडा डेटा फ्रेम है जो 23 कॉलमों से 1 पंक्ति है।

मैं इसे एक श्रृंखला में बदलना चाहता हूं? मैं सोच रहा हूं कि ऐसा करने का सबसे पैथोनिक तरीका क्या है?

मैंने कोशिश की है, pd.Series(myResults)लेकिन यह शिकायत करता है ValueError: cannot copy sequence with size 23 to array axis with dimension 1। यह समझ में नहीं आता है कि यह गणित की दृष्टि से "वेक्टर" है।

धन्यवाद!

जवाबों:


64

यह समझ में नहीं आता है कि यह गणित की दृष्टि से अभी भी "वेक्टर" है।

इसके बजाय यह कहें कि यह आयामी में अंतर को पहचानने के लिए पर्याप्त स्मार्ट है। :-)

मुझे लगता है कि आप जो सबसे सरल काम कर सकते हैं, वह उस पंक्ति का उपयोग करके अलग-अलग चयन करना है iloc, जो आपको स्तंभों के साथ नए सूचकांक और मूल्यों के रूप में एक श्रृंखला देता है:

>>> df = pd.DataFrame([list(range(5))], columns=["a{}".format(i) for i in range(5)])
>>> df
   a0  a1  a2  a3  a4
0   0   1   2   3   4
>>> df.iloc[0]
a0    0
a1    1
a2    2
a3    3
a4    4
Name: 0, dtype: int64
>>> type(_)
<class 'pandas.core.series.Series'>

2
या, एक और तरीका:df.T
ako

14
@ काओ: df.Tएक श्रृंखला का उत्पादन नहीं करता है, हालांकि, सिर्फ एक ट्रांसफ़ेड डेटाफ़्रेम।
डीएसएम

@DSM। यह सच है, df.T.iloc [0]
एंटोनियो एंड्रेस

उपयोग करने के साथ एकमात्र समस्या df.ilocयह है कि यदि आपके पास एक खाली डीएफ है, तो यह ए बढ़ाएगा IndexError। इससे बचने के लिए, अपने df को स्थानांतरित करने के बाद, df.squeezeविधि का उपयोग करें । संदर्भ। to pandas.pydata.org/pandas-docs/stable/reference/api/…
निकोलस फॉनटेनी

61

आप एकल-पंक्ति डेटाफ़्रेम (जो अभी भी एक डेटाफ़्रेम में परिणाम है) को स्थानांतरित कर सकते हैं और फिर एक श्रृंखला (उलटा ) में परिणामों को निचोड़ सकते हैंto_frame

df = pd.DataFrame([list(range(5))], columns=["a{}".format(i) for i in range(5)])

>>> df.T.squeeze()  # Or more simply, df.squeeze() for a single row dataframe.
a0    0
a1    1
a2    2
a3    3
a4    4
Name: 0, dtype: int64

नोट: @IanS द्वारा उठाए गए बिंदु को समायोजित करने के लिए (भले ही यह ओपी के प्रश्न में नहीं है), डेटाफ्रेम के आकार के लिए परीक्षण करें। मैं मान रहा हूं कि dfएक डेटाफ़्रेम है, लेकिन किनारे के मामले एक खाली डेटाफ़्रेम, आकृति के डेटाफ़्रेम (1, 1) हैं, और एक डेटाफ़्रेम एक से अधिक पंक्ति के साथ होता है, जिस स्थिति में उपयोग को उनकी वांछित कार्यक्षमता को लागू करना चाहिए।

if df.empty:
    # Empty dataframe, so convert to empty Series.
    result = pd.Series()
elif df.shape == (1, 1)
    # DataFrame with one value, so convert to series with appropriate index.
    result = pd.Series(df.iat[0, 0], index=df.columns)
elif len(df) == 1:
    # Convert to series per OP's question.
    result = df.T.squeeze()
else:
    # Dataframe with multiple rows.  Implement desired behavior.
    pass

यह @themachinist द्वारा दिए गए उत्तर की तर्ज पर भी सरल बनाया जा सकता है।

if len(df) > 1:
    # Dataframe with multiple rows.  Implement desired behavior.
    pass
else:
    result = pd.Series() if df.empty else df.iloc[0, :]

11
ध्यान दें कि मैं एक छोटे से मुद्दे का उपयोग करके भाग गया squeeze। आकार के (1, 1)एक डेटाफ्रेम के लिए यह 1 की लंबाई की श्रृंखला नहीं, बल्कि एक शानदार स्केलर होगी। squeezeअज्ञात लंबाई की वस्तुओं (जैसे के साथ groupby) का उपयोग करते समय यह एक मुश्किल से पकड़ बग के लिए नेतृत्व किया ।
इनांस

2
"थैंक्यू! Df.squeeze () ने काम किया जब df.iloc [:, 0] और df.ix [:, 0] दोनों ने बहुत अधिक इंडेक्स एरर का उत्पादन किया"
Afflatus

3
और उलटा क्यों to_frameनहीं है to_seriesया pd.Series(df)...?
14

4
आप की जरूरत नहीं है.T
elgehelge

1
@ आईएनएस पास से बचने के लिए तर्क ( df.squeeze(axis=0)या df.squeeze(axis=1)उस अक्ष पर निर्भर करता है जिसे आप संरक्षित करना चाहते हैं)
निकोलस फोंटेनी

33

आप इन दो विधियों में से किसी एक का उपयोग करके अपने डेटाफ़्रेम को स्लाइस करके श्रृंखला पुनः प्राप्त कर सकते हैं:

http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.iloc.html http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.loc.html

import pandas as pd
import numpy as np
df = pd.DataFrame(data=np.random.randn(1,8))

series1=df.iloc[0,:]
type(series1)
pandas.core.series.Series

4

दूसरा रास्ता -

मान लीजिए कि myResult एक डेटा है, जिसमें 1 कॉल और 23 पंक्तियों के रूप में आपका डेटा है

// label your columns by passing a list of names
myResult.columns = ['firstCol']

// fetch the column in this way, which will return you a series
myResult = myResult['firstCol']

print(type(myResult))

इसी तरह से, आप कई स्तंभों के साथ डेटाफ़्रेम से श्रृंखला प्राप्त कर सकते हैं।


3

आप स्टैक का भी उपयोग कर सकते हैं ()

df= DataFrame([list(range(5))], columns = [“a{}”.format(I) for I in range(5)])

यू रन डीएफ के बाद, फिर चलाएं:

df.stack()

आप श्रृंखला में अपना डेटाफ़्रेम प्राप्त करते हैं


0
data = pd.DataFrame({"a":[1,2,3,34],"b":[5,6,7,8]})
new_data = pd.melt(data)
new_data.set_index("variable", inplace=True)

यह डेटा के स्तंभ नाम के रूप में सूचकांक के साथ एक डेटाफ्रेम देता है और सभी डेटा "मान" कॉलम में मौजूद हैं


5
ढेर अतिप्रवाह में आपका स्वागत है! यह प्रश्न का उत्तर कैसे देता है? आपका कोड प्रश्न की तरह एक श्रृंखला नहीं लौटाता है
ग्रैसी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.