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_objects
自 0.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/