วิธีรับค่าจากเซลล์ของ dataframe


347

ฉันได้สร้างเงื่อนไขที่ดึงหนึ่งแถวออกจาก data frame ของฉัน:

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

ตอนนี้ฉันต้องการนำค่าจากคอลัมน์ใดคอลัมน์หนึ่ง:

val = d2['col_name']

แต่เป็นผลให้ฉันได้รับ data frame ที่มีหนึ่งแถวและหนึ่งคอลัมน์ ( เช่นหนึ่งเซลล์) มันไม่ใช่สิ่งที่ฉันต้องการ ฉันต้องการหนึ่งค่า (หมายเลขลอยหนึ่ง) ฉันจะทำมันด้วยแพนด้าได้ยังไง?


1
ถ้าคุณพยายามที่บางส่วนของคำตอบเหล่านี้ แต่จบลงด้วยการSettingWithCopyWarningที่คุณสามารถดูที่โพสต์นี้สำหรับคำอธิบายของคำเตือนและการแก้ไขปัญหาที่เป็นไปได้ / การแก้ปัญหา
cs95

คำตอบ:


430

หากคุณมี 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

16
โปรดทราบว่าวิธีนี้จะส่งคืนซีรี่ส์ไม่ใช่ค่า!
Atte Juvonen

1
@AtteJuvonen ขึ้นอยู่กับว่าคุณมีรายการซ้ำในดัชนี / คอลัมน์ของคุณ (หมายเหตุที่ / iat ทำให้เกิดข้อยกเว้นกับคอลัมน์ที่ซ้ำกันจะยื่นปัญหา)
Andy Hayden

1
แปลก. ฉันให้อ่าน loc สำหรับชื่อและ iloc สำหรับจำนวนเต็ม แต่ที่นี่ฉันเป็น iloc สำหรับทั้งจำนวนเต็มและชื่อ
mLstudent33

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
นี่ควรเป็นคำตอบเพราะเราไม่ได้คัดลอกหน่วยความจำในบรรทัดที่ไร้ประโยชน์เพื่อให้ได้องค์ประกอบเดียวภายใน
bormat

3
@hartmut คุณสามารถทำได้เสมอat[df.index[-1],'A']
cs95

105

คุณสามารถเปลี่ยน 1x1 dataframe ของคุณเป็น array numpy จากนั้นเข้าถึงค่าแรกและค่าเดียวของ array นั้น:

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

10
โปรดปรับปรุงคุณภาพของคำตอบของคุณพร้อมคำอธิบายเพิ่มเติมเล็กน้อย
Franck Gamess

แก้ไขคำตอบแรกของคุณด้วยสิ่งนี้ก่อนเพื่อสร้างความคิดเห็น ขอบคุณ
Franck Gamess

2
ฉันชอบวิธีนี้และใช้บ่อย ใช้ในการใช้งาน.get_values()[0]เช่นกัน
aaronpenne

3
ฉันคิดว่านี่เป็นคำตอบที่ดีที่สุดเพราะจะไม่ส่งคืน pandas.series และเป็นวิธีที่ง่ายที่สุด
Sean McCarthy

สิ่งนี้มีประโยชน์อย่างไรกับวิธีการของ Pandas
AMC

28

คำตอบส่วนใหญ่ใช้ilocซึ่งเหมาะสำหรับการเลือกตามตำแหน่ง

หากคุณต้องการการเลือกแบบติดป้ายกำกับ locจะสะดวกกว่า

สำหรับการรับค่าอย่างชัดเจน (equiv to deprecated df.get_value ('a', 'A'))

# 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

ฉันอัปเกรดจาก 10.1 เป็น 13.1 ก่อน iloc ไม่สามารถใช้งานได้

ตอนนี้มี 13.1 iloc[0]['label']รับอาร์เรย์อาร์เรย์ค่าเดียวแทนที่จะเป็นแบบสเกลาร์

แบบนี้:

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

เอาท์พุท:

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

ฉันคิดว่านี่น่าจะเป็นกรณีของซีรี่ส์ที่มีรายการซ้ำกัน ... ที่จริงแล้วฉันไม่เห็นสิ่งนี้คุณสามารถยกตัวอย่างเล็ก ๆ น้อย ๆ เพื่อสาธิตสิ่งนี้ได้หรือไม่
Andy Hayden

ฉันใช้นุ่น 13.x, ทั้ง iloc [] [] หรือ iloc [,] ส่งสเกลาร์ออกมา เพียง iloc ไม่ทำงานกับดัชนีเชิงลบเช่น -1
timeislove

หากคุณสามารถยกตัวอย่างของเล่นที่แสดงให้เห็นในคำตอบมันจะเป็นประโยชน์จริง ๆ !
Andy Hayden

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)
Shihe Zhang

4

สำหรับ pandas 0.10 ซึ่งไม่ilocสามารถใช้ได้ให้กรอง a 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)
Shihe Zhang

แต่iatหรือatไม่สามารถรับค่าตามชื่อคอลัมน์
sivabudh

4

ไม่แน่ใจว่านี่เป็นวิธีปฏิบัติที่ดีหรือไม่ แต่ฉันสังเกตเห็นว่าฉันสามารถได้รับคุณค่าจากการคัดเลือกซีรีส์ด้วย floatด้วย

เช่น

rate

3 0.042679

ชื่อ: Unemployment_rate, dtype: float64

float(rate)

0.0426789


ใช้งานได้กับซีรีย์หลายองค์ประกอบด้วยหรือไม่
Praxiteles


-1
df_gdp.columns

ดัชนี ([u'Country ', u'Country Code', u'Indicator Name ', u'Indicator Code', u'1960 ', u'1961', u'1961 ', u'1962', u'1964 ', คุณ , u'1965 ', u'1966', u'1967 ', u'1968', u'1969 ', u'1970', u'1971 ', u'1971', u'1972 ', u'1973', คุณ , u'1975 ', u'1976', u'1977 ', u'1978', u'1979 ', u'1980', u'1981 ', u'1981', u'1982 ', คุณ u8319' , u'1985 ', u'1986', u'1987 ', u'1988', u'1989 ', u'1990', 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'2008 ', u'20010', คุณ:

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

8100000000000.0


4
นี่เป็นคำตอบหรือคำถาม?
Vega

4
ยินดีต้อนรับสู่ Stack Overflow! ขอบคุณสำหรับข้อมูลโค้ดซึ่งอาจให้ความช่วยเหลือแบบ จำกัด และ จำกัด ทันที คำอธิบายที่เหมาะสมจะช่วยเพิ่มมูลค่าในระยะยาวได้อย่างมากโดยการอธิบายว่าเหตุใดจึงเป็นวิธีแก้ปัญหาที่ดีและจะทำให้มีประโยชน์มากขึ้นสำหรับผู้อ่านในอนาคตด้วยคำถามที่คล้ายกัน โปรดแก้ไขคำตอบของคุณเพื่อเพิ่มคำอธิบายรวมถึงข้อสมมติที่คุณได้ทำไว้
sepehr

คำตอบนี้ช่วยฉันได้จริง
CONVID19
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.