在混乱的pandas数据框中转换dtypes?一些数字列有少量字符串值

问题描述 投票:0回答:1

我有一个大数据框。我想将它们转换为适当的数据类型。 问题是在几个数字列中有字符串。我知道

convert_dtypes
to_numeric

  • convert_dtypes
    的问题在于,一旦存在字符串,它不会立即将列推断为 int/float;而是将其推断为 int/float。另一方面,
    to_numeric
    具有“强制”功能,可将所有无效示例变为 nan。
  • to_numeric
    的问题是有几个列是字符串,所以我不能只在所有列上运行它。

所以我正在寻找一个函数,如果其中存在一定百分比的数值,则将数据类型转换为数字。如果可以为此设置阈值,那就太好了。

(如前所述,数据集很大,所以我更喜欢一些自动处理所有列的解决方案。)

python pandas dataframe type-conversion
1个回答
1
投票

使用自定义函数将列转换为数字,如果匹配条件则返回数字列,否则返回原始列

DataFrame.apply
:

print (df)
   a  b  c  d  e
0  1  5  4  3  8
1  7  8  9  f  9
2  c  c  g  g  4
3  4  t  r  e  4

def f(x, thresh):
    y = pd.to_numeric(x, errors='coerce')
    return y if y.notna().mean() > thresh else x

thresh = 0.7
df1 = df.apply(f, args= (thresh,))
print (df1)
     a  b  c  d  e
0  1.0  5  4  3  8
1  7.0  8  9  f  9
2  NaN  c  g  g  4
3  4.0  t  r  e  4

print (df1.dtypes)
a    float64
b     object
c     object
d     object
e      int64
dtype: object

带有缺失值的修改解决方案(如果存在):

print (df)
   a  b    c  d  e
0  1  5    4  3  8
1  7  8  NaN  f  9
2  c  c  NaN  g  4
3  4  t    r  e  4

def f(x, thresh):
    y = pd.to_numeric(x, errors='coerce')
    return y if (y.notna() | x.isna()).mean() > thresh else x

thresh = 0.7
df1 = df.apply(f, args= (thresh,))
print (df1)
     a  b    c  d  e
0  1.0  5  4.0  3  8
1  7.0  8  NaN  f  9
2  NaN  c  NaN  g  4
3  4.0  t  NaN  e  4

print (df1.dtypes)
a    float64
b     object
c    float64
d     object
e      int64
dtype: object
© www.soinside.com 2019 - 2024. All rights reserved.