पायथन पांडा: एक डेटाफ्रेम पंक्ति को पंक्ति से भरें


133

किसी pandas.DataFrameवस्तु में एक पंक्ति जोड़ने का सरल कार्य पूरा करना कठिन प्रतीत होता है। इससे संबंधित 3 स्टैकओवरफ़्लो प्रश्न हैं, जिनमें से कोई भी काम का जवाब नहीं देता है।

यहाँ मैं करने की कोशिश कर रहा हूँ। मेरे पास एक DataFrame है जिसमें मैं पहले से ही आकार के साथ-साथ पंक्तियों और स्तंभों के नाम भी जानता हूं।

>>> df = pandas.DataFrame(columns=['a','b','c','d'], index=['x','y','z'])
>>> df
     a    b    c    d
x  NaN  NaN  NaN  NaN
y  NaN  NaN  NaN  NaN
z  NaN  NaN  NaN  NaN

अब, मेरे पास पंक्तियों के मूल्यों की पुनरावृति करने के लिए एक फ़ंक्शन है। मैं एक शब्दकोश या एक के साथ एक पंक्ति में कैसे भर सकता हूं pandas.Series? यहां विभिन्न प्रयास विफल हुए हैं:

>>> y = {'a':1, 'b':5, 'c':2, 'd':3} 
>>> df['y'] = y
AssertionError: Length of values does not match length of index

जाहिर तौर पर इसने एक पंक्ति के बजाय एक कॉलम जोड़ने की कोशिश की।

>>> y = {'a':1, 'b':5, 'c':2, 'd':3} 
>>> df.join(y)
AttributeError: 'builtin_function_or_method' object has no attribute 'is_unique'

बहुत ही अनजाने त्रुटि संदेश।

>>> y = {'a':1, 'b':5, 'c':2, 'd':3} 
>>> df.set_value(index='y', value=y)
TypeError: set_value() takes exactly 4 arguments (3 given)

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

>>> y = {'a':1, 'b':5, 'c':2, 'd':3} 
>>> df.append(y)
Exception: Can only append a Series if ignore_index=True

ठीक है, मैं सूचकांक को नजरअंदाज नहीं करना चाहता, अन्यथा यहां परिणाम है:

>>> df.append(y, ignore_index=True)
     a    b    c    d
0  NaN  NaN  NaN  NaN
1  NaN  NaN  NaN  NaN
2  NaN  NaN  NaN  NaN
3    1    5    2    3

इसने कॉलम नामों को मूल्यों के साथ संरेखित किया, लेकिन पंक्ति लेबल खो दिया।

>>> y = {'a':1, 'b':5, 'c':2, 'd':3} 
>>> df.ix['y'] = y
>>> df
                                  a                                 b  \
x                               NaN                               NaN
y  {'a': 1, 'c': 2, 'b': 5, 'd': 3}  {'a': 1, 'c': 2, 'b': 5, 'd': 3}
z                               NaN                               NaN

                                  c                                 d
x                               NaN                               NaN
y  {'a': 1, 'c': 2, 'b': 5, 'd': 3}  {'a': 1, 'c': 2, 'b': 5, 'd': 3}
z                               NaN                               NaN

वह भी बुरी तरह से विफल रहा।

तो आप इसे कैसे करते हैं ?

जवाबों:


92

df['y'] एक कॉलम सेट करेंगे

चूंकि आप एक पंक्ति सेट करना चाहते हैं, उपयोग करें .loc

ध्यान दें कि .ixयहां बराबर है, आपका विफल हो गया क्योंकि आपने पंक्ति के प्रत्येक तत्व को एक शब्दकोश निर्दिष्ट करने की कोशिश की थी, yजो आप नहीं चाहते हैं; एक श्रृंखला में परिवर्तित करना पांडा को बताता है कि आप इनपुट को संरेखित करना चाहते हैं (उदाहरण के लिए आपको तब सभी तत्वों को निर्दिष्ट करने की आवश्यकता नहीं है)

In [7]: df = pandas.DataFrame(columns=['a','b','c','d'], index=['x','y','z'])

In [8]: df.loc['y'] = pandas.Series({'a':1, 'b':5, 'c':2, 'd':3})

In [9]: df
Out[9]: 
     a    b    c    d
x  NaN  NaN  NaN  NaN
y    1    5    2    3
z  NaN  NaN  NaN  NaN

समझा। तो locडेटा फ़्रेम की विशेषता एक विशेष को परिभाषित करती __setitem__है जो जादू करता है जो मुझे लगता है।
xApple

क्या आप इसे एक पास (कॉलम, इंडेक्स और वाई के साथ) में बना सकते हैं?
एंडी हेडन

5
इसलिए यदि मैं एक बार में एक पंक्ति उत्पन्न कर सकता हूं, तो मैं डेटा फ्रेम का निर्माण कैसे करूंगा?
xApple

df = pd.DataFrame({'y': pd.Series(y)}, columns=['a','b','c','d'], index=['x','y','z'])काम के कुछ प्रकार की उम्मीद कर रहा था ?
एंडी हेडन

@xApple आप के लिए सबसे अच्छी संभावना dicts (या सूची) की एक सूची बनाने के लिए, तो बस कंस्ट्रक्टर को पास करें, बहुत अधिक कुशल होगा
जेफ

71

मेरा दृष्टिकोण था, लेकिन मैं गारंटी नहीं दे सकता कि यह सबसे तेज़ समाधान है।

df = pd.DataFrame(columns=["firstname", "lastname"])
df = df.append({
     "firstname": "John",
     "lastname":  "Johny"
      }, ignore_index=True)

4
इसने मेरे लिए शानदार ढंग से काम किया और मुझे यह तथ्य पसंद आया कि आपने स्पष्ट रूप appendसे डेटाफ़्रेम को डेटा दिया है।
जॉनी ब्रूक्स

1
ध्यान दें कि इस उत्तर के लिए स्तंभ नाम के साथ प्रत्येक पंक्ति की आवश्यकता है। स्वीकृत उत्तर के लिए भी।
पशूट करें

यदि आप पहले से पंक्तियों की संख्या नहीं जानते हैं तो भी यह काम करता है।
irene

34

यह एक सरल संस्करण है

import pandas as pd
df = pd.DataFrame(columns=('col1', 'col2', 'col3'))
for i in range(5):
   df.loc[i] = ['<some value for first>','<some value for second>','<some value for third>']`

4
बस पूछना चाहता हूँ, क्या यह सीपीयू और मेमोरी कुशल है?
czxttkl

1
मुझे df की अंतिम पंक्ति कैसे पता चलेगी इसलिए मैं हर बार अंतिम पंक्ति में शामिल होता हूं?
6

25

यदि आपकी इनपुट पंक्तियाँ शब्दकोशों की बजाय सूचियों की हैं, तो निम्नलिखित एक सरल उपाय है:

import pandas as pd
list_of_lists = []
list_of_lists.append([1,2,3])
list_of_lists.append([4,5,6])

pd.DataFrame(list_of_lists, columns=['A', 'B', 'C'])
#    A  B  C
# 0  1  2  3
# 1  4  5  6

लेकिन अगर मेरे पास मल्टी इंडेक्स है तो मैं क्या करूं? df1 = pd.DataFrame (list_of_lists, कॉलम ['A', 'B', 'C'], index = ['A', 'B']) काम नहीं करता है। गलत आकार। तो कैसे?
6
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.