我从列表列表创建了一个 pandas 数据框
import pandas as pd
df_list = [["a", "1", "2"], ["b", "3", np.nan]]
df = pd.DataFrame(df_list, columns = list("ABC"))
>>> A B C
0 a 1 2
1 b 3 NaN
有没有办法将数据帧的所有列转换为可以转换的 float ,即 B 和 C?如果您知道,以下内容适用于要转换的列:
df[["B", "C"]] = df[["B", "C"]].astype("float")
但是,如果您事先不知道哪些列包含数字,该怎么办?当我尝试时
df = df.astype("float", errors = "ignore")
所有列仍然是字符串/对象。同样,
df[["B", "C"]] = df[["B", "C"]].apply(pd.to_numeric)
转换两列(尽管“B”是 int
并且“C”是“float”,因为存在 NaN
值),但是
df = df.apply(pd.to_numeric)
显然会抛出一条错误消息,但我看不出有什么方法可以抑制它。
是否有可能在不循环遍历每一列的情况下执行此字符串- float 转换,以尝试 .astype("float", errors = "ignore")
?
最佳答案
我想你需要参数 errors='ignore'
in to_numeric
:
df = df.apply(pd.to_numeric, errors='ignore')
print (df.dtypes)
A object
B int64
C float64
dtype: object
如果不是混合值 - 数字与字符串,它工作得很好:
df_list = [["a", "t", "2"], ["b", "3", np.nan]]
df = pd.DataFrame(df_list, columns = list("ABC"))
df = df.apply(pd.to_numeric, errors='ignore')
print (df)
A B C
0 a t 2.0 <=added t to column B for mixed values
1 b 3 NaN
print (df.dtypes)
A object
B object
C float64
dtype: object
编辑:
你也可以将 int
向下转换为 float
:
df = df.apply(pd.to_numeric, errors='ignore', downcast='float')
print (df.dtypes)
A object
B float32
C float32
dtype: object
它等同于:
df = df.apply(lambda x: pd.to_numeric(x, errors='ignore', downcast='float'))
print (df.dtypes)
A object
B float32
C float32
dtype: object
关于python - 在可能的情况下,将字符串转换为所有 pandas 列中的 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48518735/