在所有pandas列中将字符串转换为float,这是可能的

Mr.*_*. T 5 python type-conversion python-3.x pandas

我从列表列表中创建了一个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
Run Code Online (Sandbox Code Playgroud)

有没有办法将数据帧的所有列转换为float,可以转换,即B和C?如果您知道,以下工作将转换为哪些列:

  df[["B", "C"]] = df[["B", "C"]].astype("float")
Run Code Online (Sandbox Code Playgroud)

但是,如果您事先不知道哪些列包含数字,您会怎么做?当我尝试

  df = df.astype("float", errors = "ignore")
Run Code Online (Sandbox Code Playgroud)

所有列仍然是字符串/对象.同样的,

df[["B", "C"]] = df[["B", "C"]].apply(pd.to_numeric)
Run Code Online (Sandbox Code Playgroud)

转换两列(虽然"B"是int和"C"是"浮动",因为NaN值存在),但是

df = df.apply(pd.to_numeric)
Run Code Online (Sandbox Code Playgroud)

显然会抛出一条错误消息,我没有看到一种方法来抑制它.
是否有可能执行此字符串浮点转换而不循环遍历每列,尝试.astype("float", errors = "ignore")

jez*_*ael 7

我认为你需要参数errors='ignore'to_numeric:

df = df.apply(pd.to_numeric, errors='ignore')
print (df.dtypes)
A     object
B      int64
C    float64
dtype: object
Run Code Online (Sandbox Code Playgroud)

如果不是混合值,它工作得很好 - 带字符串的数字:

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
Run Code Online (Sandbox Code Playgroud)

编辑:

你也可以转发intfloats:

df = df.apply(pd.to_numeric, errors='ignore', downcast='float')
print (df.dtypes)
A     object
B    float32
C    float32
dtype: object
Run Code Online (Sandbox Code Playgroud)

它与:

df = df.apply(lambda x: pd.to_numeric(x, errors='ignore', downcast='float'))
print (df.dtypes)
A     object
B    float32
C    float32
dtype: object
Run Code Online (Sandbox Code Playgroud)