แปลงสตริงตัวเลขด้วยลูกน้ำในแพนด้า DataFrame เป็น float


92

ฉันมี DataFrame ที่มีตัวเลขเป็นสตริงพร้อมเครื่องหมายจุลภาคสำหรับเครื่องหมายหลักพัน ฉันต้องแปลงมันเป็นลอย

a = [['1,200', '4,200'], ['7,000', '-0.03'], [ '5', '0']]
df=pandas.DataFrame(a)

ฉันเดาว่าฉันต้องใช้ locale.atof แน่นอน

df[0].apply(locale.atof)

ทำงานได้ตามที่คาดไว้ ฉันได้รับชุดลอย

แต่เมื่อฉันใช้กับ DataFrame ฉันได้รับข้อผิดพลาด

df.apply(locale.atof)

TypeError: ("ไม่สามารถแปลงชุดข้อมูลเป็น", u'occurred ที่ดัชนี 0 ')

และ

df[0:1].apply(locale.atof)

ให้ข้อผิดพลาดอื่น:

ValueError: ('ตัวอักษรไม่ถูกต้องสำหรับ float (): 1,200', คุณเกิดขึ้นที่ดัชนี 0 ')

ดังนั้นฉันจะแปลงDataFrameสตริงนี้เป็น DataFrame of float ได้อย่างไร


2
คำถามเก่า แต่ OP ได้รับข้อผิดพลาดนั้นเนื่องจากapplyบน DataFrame ส่งทั้งคอลัมน์ไปยังฟังก์ชันเป็นชุด (ในกรณีนี้locale.atofซึ่งคาดว่าจะมีสตริง) หากคุณใช้applymapวิธีการที่ @AndyHayden ทำในคำตอบด้านล่างนี้คุณควรจะทำได้ดี
TC Proctor

คำตอบ:


150

หากคุณกำลังอ่านจาก csvคุณสามารถใช้อาร์กิวเมนต์หลักพัน :

df.read_csv('foo.tsv', sep='\t', thousands=',')

วิธีนี้น่าจะมีประสิทธิภาพมากกว่าการดำเนินการเป็นขั้นตอนแยกต่างหาก


คุณต้องตั้งค่าภาษาก่อน:

In [ 9]: import locale

In [10]: from locale import atof

In [11]: locale.setlocale(locale.LC_NUMERIC, '')
Out[11]: 'en_GB.UTF-8'

In [12]: df.applymap(atof)
Out[12]:
      0        1
0  1200  4200.00
1  7000    -0.03
2     5     0.00

ฉันควรจะบอกว่าฉันตั้งสถานที่ ฉันยังคงได้รับข้อผิดพลาด
pheon

2
แต่ฉันใช้ df.read_fwf และมีตัวเลือก "พัน = ','" ด้วยซึ่งใช้งานได้ ขอบคุณ.
pheon

แล้วอีกครั้งทำไม df.applymap (atof) ถึงทำงานให้คุณ แต่ไม่ใช่ฉัน ภาษาของฉันคือ 'en_US.UTF-8'
pheon

12
ฉันโหวตสิ่งนี้สำหรับเคล็ดลับอาร์กิวเมนต์ 'พัน' สำหรับฟังก์ชัน read_csv นั่นใช้ได้ผลดีสำหรับฉัน
rockfakie

4
ฉันอยากจะเพิ่มว่าคุณยังสามารถใช้ "decimal = ','" ได้หากคุณกำลังจัดการกับทศนิยม
VessoVit

34

คุณอาจใช้เมธอดpandas.Series.str.replace :

df.iloc[:,:].str.replace(',', '').astype(float)

วิธีนี้สามารถลบหรือแทนที่เครื่องหมายจุลภาคในสตริง


1
ฉันได้รับ "AttributeError: วัตถุ" DataFrame "ไม่มีแอตทริบิวต์" str "" ไม่รู้ว่าทำไม ...
krassowski

1
แต่ได้ผล:df.apply(lambda x: x.str.replace(',', '').astype(float), axis=1)
krassowski

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