डेटाफ़्रेम के सेल से मूल्य कैसे प्राप्त करें?


344

मैंने एक ऐसी स्थिति का निर्माण किया है जो मेरे डेटा फ्रेम से ठीक एक पंक्ति निकालती है:

d2 = df[(df['l_ext']==l_ext) & (df['item']==item) & (df['wn']==wn) & (df['wd']==1)]

अब मैं एक विशेष कॉलम से मान लेना चाहूंगा:

val = d2['col_name']

लेकिन परिणामस्वरूप मुझे एक डेटा फ्रेम मिलता है जिसमें एक पंक्ति और एक कॉलम ( यानी एक सेल) होता है। यह वह नहीं है जो मुझे चाहिए। मुझे एक मान (एक फ्लोट संख्या) की आवश्यकता है। मैं इसे पंडों में कैसे कर सकता हूं?


1
यदि आपने इनमें से कुछ उत्तरों की कोशिश की है, लेकिन एक के साथ समाप्त हो गया है SettingWithCopyWarning, तो आप चेतावनी और संभावित समाधान / समाधान की व्याख्या के लिए इस पोस्ट पर एक नज़र डाल सकते हैं।
cs95

जवाबों:


428

यदि आपके पास केवल एक पंक्ति के साथ एक DataFrame है, तो पहली (केवल) पंक्ति को एक श्रृंखला के रूप में उपयोग करें iloc, और फिर स्तंभ नाम का उपयोग करके मान:

In [3]: sub_df
Out[3]:
          A         B
2 -0.133653 -0.030854

In [4]: sub_df.iloc[0]
Out[4]:
A   -0.133653
B   -0.030854
Name: 2, dtype: float64

In [5]: sub_df.iloc[0]['A']
Out[5]: -0.13365288513107493

1
@ स्कोलॉजिस्ट इसे देख रहे हैं, मुझे कुछ पता नहीं है। सवाल थोड़ा अजीब है, लेकिन यह पढ़ता है कि पहली छमाही उत्तरार्द्ध के लिए स्थिर है। ( atवास्तव में एक अच्छा जवाब है, हालांकि मुझे लगता है कि यह अजीब है ix:))
एंडी हेडन

9
@ स्कोलॉजिस्ट मैं मानता हूं कि इसकी हास्यास्पद बात यह है कि यह आवश्यक है। यह भी काम नहीं करता है जब आप सशर्त इनलाइन पास करने की कोशिश करते हैं; my_df.loc[my_df['Col1'] == foo]['Col2']अभी भी प्रकार की एक वस्तु लौटाता है<class 'pandas.core.series.Series'>
user5359531

15
ध्यान दें कि यह समाधान एक श्रृंखला लौटाता है, मूल्य नहीं!
जुवोनेन

1
@AteteJuvonen यह निर्भर करता है कि क्या आपके पास आपके अनुक्रमणिका / कॉलम में डुप्लिकेट है (नोट / iat डुप्लिकेट कॉलम के साथ अपवाद उठाता है, एक समस्या दर्ज करेगा)।
एंडी हेडन

1
अजीब। मैं पढ़ता रहता हूं कि नाम के लिए लोकेशन है और आईलोक पूर्णांक के लिए है, लेकिन यहाँ मैं पूर्णांक और नाम दोनों के लिए
आईलॉक हूं

205

ये स्केलर के लिए तेजी से पहुंच हैं

In [15]: df = pandas.DataFrame(numpy.random.randn(5,3),columns=list('ABC'))

In [16]: df
Out[16]: 
          A         B         C
0 -0.074172 -0.090626  0.038272
1 -0.128545  0.762088 -0.714816
2  0.201498 -0.734963  0.558397
3  1.563307 -1.186415  0.848246
4  0.205171  0.962514  0.037709

In [17]: df.iat[0,0]
Out[17]: -0.074171888537611502

In [18]: df.at[0,'A']
Out[18]: -0.074171888537611502

9
मुझे यह जवाब बहुत पसंद है। लेकिन जब आप कर सकते हैं तो .iloc[-1]['A']आप at[-1,'A']अंतिम पंक्ति प्रविष्टि
hartmut

3
इसका उत्तर होना चाहिए क्योंकि हम स्मृति में एक बेकार लाइन की नकल नहीं करते हैं ताकि केवल एक तत्व प्राप्त हो सके।
बोरमट

3
@hartmut आप हमेशा बस कर सकते हैंat[df.index[-1],'A']
cs95

105

आप अपने 1x1 डेटाफ़्रेम को एक सुपीरियर एरे में बदल सकते हैं, फिर उस एरे के पहले और एकमात्र मान तक पहुँच सकते हैं:

val = d2['col_name'].values[0]

10
कृपया थोड़े और स्पष्टीकरण के साथ अपने उत्तर की गुणवत्ता में सुधार करें।
फ्रेंक गामा

टिप्पणी बनाने से पहले इसके साथ अपने प्रारंभिक उत्तर को संपादित करें। धन्यवाद
फ़्रैंक Gamess

2
मैं इस पद्धति को पसंद करता हूं और इसका अक्सर उपयोग करता हूं। .get_values()[0]साथ ही उपयोग में लाया जाता है।
अरोनपेन्

3
मुझे लगता है कि यह एक सबसे अच्छा जवाब है क्योंकि यह एक पंडों को नहीं लौटाता है। और यह सबसे सरल है।
सीन मैकार्थी

पंडों द्वारा प्रदान किए गए तरीकों पर इसका क्या लाभ है?
एएमसी

28

अधिकांश उत्तर उपयोग कर रहे हैं ilocजो स्थिति के अनुसार चयन के लिए अच्छा है।

यदि आपको चयन-दर-लेबल की loc आवश्यकता है तो अधिक सुविधाजनक होगा।

एक मूल्य प्राप्त करने के लिए स्पष्ट रूप से (डीएवीसीएटीगेट के बराबर ('ए', 'ए'))

# this is also equivalent to df1.at['a','A']
In [55]: df1.loc['a', 'A'] 
Out[55]: 0.13200317033032932

18

मुझे कॉलम और इंडेक्स नामों द्वारा चयनित एक सेल के मूल्य की आवश्यकता थी। इस समाधान ने मेरे लिए काम किया:

original_conversion_frequency.loc[1,:].values[0]


16

यह पांडा 10.1 / 13.1 के बाद परिवर्तनों की तरह दिखता है

Iloc उपलब्ध नहीं होने से पहले मैंने 10.1 से 13.1 तक अपग्रेड किया था।

अब 13.1 के साथ, iloc[0]['label']स्केलर के बजाय एकल मान सरणी प्राप्त करता है।

ऐशे ही:

lastprice=stock.iloc[-1]['Close']

आउटपुट:

date
2014-02-26 118.2
name:Close, dtype: float64

मुझे लगता है कि यह केवल डुप्लिकेट प्रविष्टियों के साथ श्रृंखला के लिए मामला होना चाहिए ... वास्तव में, मैं यह नहीं देखता, क्या आप इसे प्रदर्शित करने के लिए एक छोटा उदाहरण दे सकते हैं?
एंडी हेडन

मैं पंडों का इस्तेमाल करता था 13.x, दोनों iloc [] [] या iloc [,] आउटपुट एक अदिश। सिर्फ iloc नकारात्मक सूचकांक के साथ काम नहीं कर रहा है, जैसे -1
टाइमइसलोवे

यदि आप उत्तर में यह प्रदर्शित करते हुए एक खिलौना उदाहरण दे सकते हैं तो यह वास्तव में उपयोगी होगा!
एंडी हेडन

5

सबसे तेज / आसान विकल्प जो मैंने पाया है वे निम्नलिखित हैं। 501 पंक्ति सूचकांक का प्रतिनिधित्व करता है।

df.at[501,'column_name']
df.get_value(501,'column_name')

5
get_valueअब पदावनत किया गया है (v0.21.0 RC1 (13 अक्टूबर, 2017)) संदर्भ यहाँ है .get_value and .set_value on Series, DataFrame, Panel, SparseSeries, and SparseDataFrame are deprecated in favor of using .iat[] or .at[] accessors (GH15269)
शिह झांग

4

पांडा 0.10 के लिए, जहां ilocअयोग्य है, एक को फ़िल्टर करें DFऔर कॉलम के लिए पहली पंक्ति डेटा प्राप्त करें VALUE:

df_filt = df[df['C1'] == C1val & df['C2'] == C2val]
result = df_filt.get_value(df_filt.index[0],'VALUE')

यदि अधिक है तो 1 पंक्ति फ़िल्टर की गई है, पहली पंक्ति मान प्राप्त करें। यदि खाली डेटा फ़्रेम में फ़िल्टर परिणाम होता है तो एक अपवाद होगा।


3
get_valueअब पदावनत कर दिया गया है (v0.21.0 RC1 (13 अक्टूबर, 2017)) संदर्भ यहां है .get_value and .set_value on Series, DataFrame, Panel, SparseSeries, and SparseDataFrame are deprecated in favor of using .iat[] or .at[] accessors (GH15269)
शिहे झांग

लेकिन iatया atस्तंभ नाम के आधार पर मान प्राप्त नहीं कर सकते।
शिवाबुध

4

यकीन नहीं है कि यह एक अच्छा अभ्यास है, लेकिन मैंने देखा कि मैं भी श्रृंखला के रूप में कास्टिंग करके केवल मूल्य प्राप्त कर सकता हूं float

जैसे

rate

3 0.042679

नाम: बेरोजगारी_दार, dtype: float64

float(rate)

0.0426789


क्या यह बहु-तत्व श्रृंखला के साथ भी काम करता है?
प्रिक्सिटेलिस


-1
df_gdp.columns

सूचकांक ([u'Country, u'Country Code ', u'Indicator Name', u'Indicator Code ', u'1960', u'1961 ', u'1962', u'1963 ', u'1964' , u'1965 ', u'1966', u'1967 ', u'1969', u'1970 ', u'1971', u'1972 ', u'1973', u'1974 ' , u'1975 ', u'1976', u'1977 ', u'1978', u'1979 ', u'1981', u'1982 ', u'1983', u'1984 ' , u'1985 ', u'1986', u'1987 ', u'1988', u'1989 ', u'1991', u'1992 ', u'1993', u'1994 ' , u'1995 ', u'1996', u'1997 ', u'1998', u'1999 ', u'2000',u'2001 ', u'2002', u'2003 ', u'2004', u'2005 ', u'2006', u'2007 ', u'2008', u'2009 ', u'2010', u'2011 ', u'2012', u'2013 ', u'2014', u'2015 ', u'2016'], dtype = 'ऑब्जेक्ट')

df_gdp[df_gdp["Country Code"] == "USA"]["1996"].values[0]

8100000000000.0


4
यह एक जवाब है या एक सवाल है?
वेगा

4
ढेर अतिप्रवाह में आपका स्वागत है! कोड स्निपेट के लिए धन्यवाद, जो कुछ सीमित, तत्काल सहायता प्रदान कर सकता है। एक उचित व्याख्या इस समस्या का एक अच्छा समाधान क्यों है, यह वर्णन करके अपने दीर्घकालिक मूल्य में बहुत सुधार करेगी , और भविष्य के पाठकों के लिए अन्य समान प्रश्नों के साथ इसे और अधिक उपयोगी बना देगी। कृपया कुछ स्पष्टीकरण जोड़ने के लिए अपने उत्तर को संपादित करें, जिसमें आपके द्वारा की गई धारणाएँ शामिल हैं।
sepehr

नकारात्मक वोटों के बावजूद, इस जवाब ने वास्तव में मेरी मदद की।
CONvid19
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.