Python 更改数据帧中的多个列
我是Python的初学者,今天第一次进入熊猫世界。我要做的是将多个列从string转换为float。下面是一个简单的例子:Python 更改数据帧中的多个列,python,pandas,Python,Pandas,我是Python的初学者,今天第一次进入熊猫世界。我要做的是将多个列从string转换为float。下面是一个简单的例子: 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,7
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
功能?您的逻辑有几个问题:
1:2
排除2
,与列表切片或slice
对象语法一致。改用1:3
mystr
或x
而不是str
作为变量或参数名try
/结构时,通常应指定错误类型,在本例中为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
但是,您的逻辑效率很低:您应该尽可能利用列操作。这可以通过以下方式实现,并应用于每个系列:
为什么不使用
astype
?您是如何读取数据的?不过,使用参数为“千”的read_csv可能会做些小动作?使用applymap
并以这种方式处理错误?你最终还是会遇到混合类型?@roganjosh,是的,我添加了推荐的系列解决方案。这里的最终产品是相同的,因为(显然)熊猫确实在applymap
之后重铸为float
。不过,我不相信这一点,这也是使用系列方法的另一个原因。Python和Pandas对我来说是全新的。谢谢你的帮助help@MikeHenderson,没问题,我的大部分观点都是Python的通用观点(不仅仅与熊猫有关),所以希望它能在其他地方帮助您。
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