วิธีรับค่าจาก Pandas DataFrame ไม่ใช่ดัชนีและประเภทวัตถุ


104

สมมติว่าฉันมี DataFrame ต่อไปนี้

เลขตัวอักษร
ก 1
B 2
ค 3
ง 4

ซึ่งสามารถรับได้จากรหัสต่อไปนี้

import pandas as pd

letters=pd.Series(('A', 'B', 'C', 'D'))
numbers=pd.Series((1, 2, 3, 4))
keys=('Letters', 'Numbers')
df=pd.concat((letters, numbers), axis=1, keys=keys)

ตอนนี้ฉันต้องการรับค่า C จากคอลัมน์ Letters

บรรทัดคำสั่ง

df[df.Letters=='C'].Letters

จะกลับมา

2 ค
ชื่อ: ตัวอักษร dtype: object

ฉันจะรับเฉพาะค่า C เท่านั้นไม่ใช่เอาต์พุตทั้งสองบรรทัดได้อย่างไร


6
ในบันทึกที่ไม่เกี่ยวข้องมีวิธีที่ดีกว่าในการปรับโครงสร้าง DataFrame ของคุณ:pd.DataFrame({'Letters': letters, 'Numbers': numbers})
JoeCondron

คำตอบ:


145
df[df.Letters=='C'].Letters.item()

สิ่งนี้ส่งคืนองค์ประกอบแรกในดัชนี / ซีรี่ส์ที่ส่งคืนจากการเลือกนั้น ในกรณีนี้ค่าจะเป็นองค์ประกอบแรกเสมอ

แก้ไข:

หรือคุณสามารถเรียกใช้ loc () และเข้าถึงองค์ประกอบแรกด้วยวิธีนั้น สิ่งนี้สั้นกว่าและเป็นวิธีที่ฉันได้นำมาใช้ในอดีต


2
ฉันชอบวิธีนี้ แต่ฉันได้รับคำเตือน:FutureWarning: "item" has been deprecated and will be removed in a future version
AlexG

2
@AlexG: คุณสามารถใช้สิ่งนี้แทนได้: df[df.Letters=='C'].Letters.iloc[0]. สร้างองค์ประกอบแรก (ซึ่งเป็นเอกลักษณ์ด้วย) ในชุดผลลัพธ์
Anh-Thi DINH

โดยใช้ loc [: 1] ยังคงแสดงดัชนีถัดจากค่า :(
Sonic Soul

@AlexG และ @Sonic Soul: ลองใช้df[df.Letters=='C'].Letters.squeeze()แทน ทำงานในลักษณะเดียวกัน :)
user78910

52

ใช้valuesแอตทริบิวต์เพื่อส่งคืนค่าเป็นอาร์เรย์ np จากนั้นใช้[0]เพื่อรับค่าแรก:

In [4]:
df.loc[df.Letters=='C','Letters'].values[0]

Out[4]:
'C'

แก้ไข

โดยส่วนตัวแล้วฉันชอบเข้าถึงคอลัมน์โดยใช้ตัวดำเนินการตัวห้อย:

df.loc[df['Letters'] == 'C', 'Letters'].values[0]

ทั้งนี้เพื่อหลีกเลี่ยงปัญหาที่ชื่อคอลัมน์สามารถมีช่องว่างหรือขีดคั่นซึ่งหมายความว่าการเข้าถึงโดยใช้-.


1
โดยส่วนตัวแล้วฉันไม่ได้ใช้.คอลัมน์เพื่อเข้าถึงเนื่องจากจะไม่ได้ผลเสมอไปเช่นหากชื่อคอลัมน์ขึ้นต้นด้วยค่าตัวเลขหรือมีอักขระที่ไม่ใช่อัลฟาเช่นช่องว่างในชื่อคอลัมน์ดังนั้นฉันจึงชอบเสมอdf['col_name']
EdChum

ฉันเห็น. นั่นเป็นเหตุผลว่าทำไมทุกที่ที่ฉันมองฉันมักจะพบdf['col_name']สัญกรณ์แทนที่จะเป็น.สัญกรณ์ ขอบคุณอีกครั้ง.
Eduardo

1
มันไม่สำคัญจริง ๆ แต่ในการเลือกของคุณคุณเข้าถึงคอลัมน์ 'จดหมาย' โดยใช้สัญกรณ์จุด df.loc [df.Letters == 'C'] หากมีช่องว่างในชื่อคอลัมน์ของคุณคุณน่าจะใช้ตัวแปลงเพื่อตัดสิ่งเหล่านั้นออกเช่นเดียวกับที่คุณนำเข้าจากไฟล์ CSV หรือ Excel
valkn0t

@ thomas-ato ฉันจะอัปเดตคำตอบของฉัน แต่ฉันไม่เห็นด้วยกับการแก้ไขคอลัมน์เป็นขั้นตอนเพิ่มเติมเว้นแต่ว่าจำเป็นในกรณีนี้ฉันยอมรับว่ามันไม่แตกต่างกัน
EdChum

1
import pandas as pd

dataset = pd.read_csv("data.csv")
values = list(x for x in dataset["column name"])

>>> values[0]
'item_0'

แก้ไข:

จริงๆแล้วคุณสามารถทำดัชนีชุดข้อมูลได้เหมือนกับอาร์เรย์เก่า ๆ

import pandas as pd

dataset = pd.read_csv("data.csv")
first_value = dataset["column name"][0]

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