python - 使用 pandas 将字符串对象转换为 int/float

标签 python csv pandas

import pandas as pd

path1 = "/home/supertramp/Desktop/100&life_180_data.csv"

mydf =  pd.read_csv(path1)

numcigar = {"Never":0 ,"1-5 Cigarettes/day" :1,"10-20 Cigarettes/day":4}

print mydf['Cigarettes']

mydf['CigarNum'] = mydf['Cigarettes'].apply(numcigar.get).astype(float)

print mydf['CigarNum']

mydf.to_csv('/home/supertramp/Desktop/powerRangers.csv')

csv 文件“100&life_180_data.csv”包含年龄、bmi、香烟、酒精等列。

No                int64
Age               int64
BMI             float64
Alcohol          object
Cigarettes       object
dtype: object

香烟列包含“从不”、“1-5 根香烟/天”、“10-20 根香烟/天”。 我想为这些对象分配权重(从不,1-5 支香烟/天,....)

预期的输出是附加的新列 CigarNum,仅包含数字 0、1、2 CigarNum 与预期一样直到 8 行,然后在 CigarNum 列中显示 Nan 直到最后一行

0                     Never
1                     Never
2        1-5 Cigarettes/day
3                     Never
4                     Never
5                     Never
6                     Never
7                     Never
8                     Never
9                     Never
10                    Never
11                    Never
12     10-20 Cigarettes/day
13       1-5 Cigarettes/day
14                    Never
...
167                    Never
168                    Never
169     10-20 Cigarettes/day
170                    Never
171                    Never
172                    Never
173                    Never
174                    Never
175                    Never
176                    Never
177                    Never
178                    Never
179                    Never
180                    Never
181                    Never
Name: Cigarettes, Length: 182, dtype: object

在前几行之后,我得到的输出不应该给出 NaN。

0      0
1      0
2      1
3      0
4      0
5      0
6      0
7      0
8      0
9      0
10   NaN
11   NaN
12   NaN
13   NaN
14     0
...
167   NaN
168   NaN
169   NaN
170   NaN
171   NaN
172   NaN
173   NaN
174   NaN
175   NaN
176   NaN
177   NaN
178   NaN
179   NaN
180   NaN
181   NaN
Name: CigarNum, Length: 182, dtype: float64

最佳答案

好的,第一个问题是你有嵌入的空格导致函数错误地应用:

使用矢量化 str 修复此问题:

mydf['Cigarettes'] = mydf['Cigarettes'].str.replace(' ', '')

现在创建您的新列应该可以正常工作了:

mydf['CigarNum'] = mydf['Cigarettes'].apply(numcigar.get).astype(float)

更新

感谢@Jeff 一如既往地指出出色的做事方式:

所以你可以调用 replace 而不是调用 apply:

mydf['CigarNum'] = mydf['Cigarettes'].replace(numcigar)
# now convert the types
mydf['CigarNum'] = mydf['CigarNum'].convert_objects(convert_numeric=True)

你也可以使用 factorize 方法。

考虑一下为什么不直接将 dict 值设置为 float ,然后避免类型转换?

所以:

numcigar = {"Never":0.0 ,"1-5 Cigarettes/day" :1.0,"10-20 Cigarettes/day":4.0}

0.17.0 或更新版本

convert_objects0.17.0 起已弃用,已替换为 to_numeric

mydf['CigarNum'] = pd.to_numeric(mydf['CigarNum'], errors='coerce')

这里 errors='coerce' 将返回 NaN,其中的值无法转换为数值,否则会引发异常

关于python - 使用 pandas 将字符串对象转换为 int/float,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24037507/

相关文章:

python - 使用 OpenCV/Python 绘制二元掩码轮廓

python - 在写入 csv 文件时防止字符串以逗号分隔

PowerShell Active Directory IF 语句

Python:读取没有默认分隔符且包含数百万条记录的文件并将其放入数据框( Pandas )时的效率?

python - 在 Pandas 中使用 groupby 和向量平均值的前所未有的 TypeError

python - 如何计算列中时间戳之间的( Pandas )时间增量?

python - 使用 unicode 文件名打开文件?

python - 在 EMR 上运行 pyspark 脚本

python - python 动态生成函数参数

python - 如何在多个文件中一次高效地搜索多个字符串?