数据框列:仅将数字转换为int,将字词保留为字符串

时间:2017-12-06 18:22:14

标签: python pandas dataframe

如下面的屏幕截图所示,我在excel文件中有2列。我正在尝试降低数字字段的精度,例如100.54000000000001到100.540。该数字存储为字符串,因此当我使用

将其转换为float时
df['Unnamed: 5'] = pd.to_numeric(df['Unnamed: 5'], errors='coerce')

它将字符串转换为NaN。任何人都可以帮我解决问题吗?我试图只将数字转换为int,而单词应保持字符串。

screenshot of the data

编辑:将数字值四舍五入后转换回字符串是可以接受的。我的代码如下:

>>> import pandas as pd 
>>> import numpy as np 
>>> xl = pd.ExcelFile("WSJ_template.xls") 
>>> xl.sheet_names 
[u'losers', u'winners'] 
>>> dfw = xl.parse("winners") 
>>> dfw.head() 
<output>
>>> dfw = dfw.apply(pd.to_numeric, errors='coerce').combine_first(dfw) 
>>> dfw = dfw.replace(np.nan, '', regex=True) 
>>> dfw
<output>

1 个答案:

答案 0 :(得分:0)

正如您已经确定的那样,我们最好使用pd.DataFrame.apply。唯一的区别是使用内置函数,而不是使用内置函数。我们将定义自己的函数。

我们首先填写DataFrame(这是一个占位符,你已经覆盖了这个):

df = pd.DataFrame(columns=['Unnamed: 5', 'Unnamed: 6'],
                  data=[['NaN', 'NaN'], 
                        ['Average', 'Weekly'], 
                        ['100.540000000001', '0.2399999999999999'],
                        ['99.3299999999998', '0.1700000000000001'],
                        ['95.4800000000004', 'change'],
                        ['bid', '1.929999999999999']])

现在我们定义一个用于转换值的函数。此函数应尝试强制转换为float,如果有效,则返回舍入值。如果它不起作用,只需返回原始值。这是一条可能的路线:

def round_only_nums(val):
    try:
        return '%s' % round(float(val), 3)
    except:
        return val

接下来,让我们应用需要处理的列:

cols_to_process = ['Unnamed: 5', 'Unnamed: 6']
for col in cols_to_process:
    df[col] = df[col].apply(round_only_nums)

我们的结果:

>>> df
  Unnamed: 5 Unnamed: 6
0        nan        nan
1    Average     Weekly
2     100.54       0.24
3      99.33       0.17
4      95.48     change
5        bid       1.93