我是Python的初学者,今天我第一次涉足Pandas。我想做的是将几列从字符串转换为浮点数。这是一个简单的示例:
import numpy as np
import pandas as pd
def convert(str):
try:
return float(str.replace(',', ''))
except:
return None
df = pd.DataFrame([
['A', '1,234', '456,789'],
['B', '1' , '---' ]
], columns=['Company Name', 'X', 'Y'])
我想将X
和Y
转换为浮点型。现实中有更多列,而且我并不总是知道X
和Y
的列名,因此我必须使用整数索引。
这有效:
df.iloc[:, 1] = df.iloc[:, 1].apply(convert)
df.iloc[:, 2] = df.iloc[:, 2].apply(convert)
这不是:
df.iloc[:, 1:2] = df.iloc[:, 1:2].apply(convert)
# Error: could not broadcast input array from shape (2) into shape (2,1)
反正有一次将convert
函数同时应用于多列吗?
答案 0 :(得分:1)
您的逻辑存在几个问题:
1:2
排除 2
,与列表切片或slice
对象语法一致。请改用1:3
。pd.Series.apply
将智能元素函数应用于序列。要将智能元素函数应用于数据框,您需要pd.DataFrame.applymap
。mystr
或x
代替str
作为变量或参数名称。try
/ except
构造时,通常应指定错误类型,在这种情况下,应指定ValueError
。因此,这是一种解决方案:
def convert(x):
try:
return float(x.replace(',', ''))
except ValueError:
return None
df.iloc[:, 1:3] = df.iloc[:, 1:3].applymap(convert)
print(df)
Company Name X Y
0 A 1234 456789
1 B 1 NaN
但是,您的逻辑效率很低:您应该尽可能利用按列操作。这可以通过pd.DataFrame.apply
以及应用于每个系列的pd.to_numeric
来实现:
def convert_series(x):
return pd.to_numeric(x.str.replace(',', ''), errors='coerce')
df.iloc[:, 1:3] = df.iloc[:, 1:3].apply(convert_series)
print(df)
Company Name X Y
0 A 1234 456789
1 B 1 NaN