pandas: to_numeric for multiple columns
我正在使用以下df:
1 2 3 4 5 | c.sort_values('2005', ascending=False).head(3) GeoName ComponentName IndustryId IndustryClassification Description 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 37926 Alabama Real GDP by state 9 213 Support activities for mining 99 98 117 117 115 87 96 95 103 102 (NA) 37951 Alabama Real GDP by state 34 42 Wholesale trade 9898 10613 10952 11034 11075 9722 9765 9703 9600 9884 10199 37932 Alabama Real GDP by state 15 327 Nonmetallic mineral products manufacturing 980 968 940 1084 861 724 714 701 589 641 (NA) |
我想在所有年份强制数字:
1 | c['2014'] = pd.to_numeric(c['2014'], errors='coerce') |
有没有一种简单的方法可以做到这一点,还是我必须全部输入?
更新:之后您无需转换您的值,您可以在阅读CSV时即时执行此操作:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | In [165]: df=pd.read_csv(url, index_col=0, na_values=['(NA)']).fillna(0) In [166]: df.dtypes Out[166]: GeoName object ComponentName object IndustryId int64 IndustryClassification object Description object 2004 int64 2005 int64 2006 int64 2007 int64 2008 int64 2009 int64 2010 int64 2011 int64 2012 int64 2013 int64 2014 float64 dtype: object |
如果需要将多个列转换为数字dtypes - 请使用以下技术:
样本来源DF:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | In [271]: df Out[271]: id a b c d e f 0 id_3 AAA 6 3 5 8 1 1 id_9 3 7 5 7 3 BBB 2 id_7 4 2 3 5 4 2 3 id_0 7 3 5 7 9 4 4 id_0 2 4 6 4 0 2 In [272]: df.dtypes Out[272]: id object a object b int64 c int64 d int64 e int64 f object dtype: object |
将所选列转换为数字dtypes:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | In [273]: cols = df.columns.drop('id') In [274]: df[cols] = df[cols].apply(pd.to_numeric, errors='coerce') In [275]: df Out[275]: id a b c d e f 0 id_3 NaN 6 3 5 8 1.0 1 id_9 3.0 7 5 7 3 NaN 2 id_7 4.0 2 3 5 4 2.0 3 id_0 7.0 3 5 7 9 4.0 4 id_0 2.0 4 6 4 0 2.0 In [276]: df.dtypes Out[276]: id object a float64 b int64 c int64 d int64 e int64 f float64 dtype: object |
PS如果要选择所有
1 | cols = df.columns[df.dtypes.eq('object')] |
另一种方法是使用
1 2 | cols = ['col1', 'col2', 'col3'] data[cols] = data[cols].apply(pd.to_numeric, errors='coerce', axis=1) |
您可以使用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | print df.columns[5:] Index([u'2004', u'2005', u'2006', u'2007', u'2008', u'2009', u'2010', u'2011', u'2012', u'2013', u'2014'], dtype='object') for col in df.columns[5:]: df[col] = pd.to_numeric(df[col], errors='coerce') print df GeoName ComponentName IndustryId IndustryClassification \ 37926 Alabama Real GDP by state 9 213 37951 Alabama Real GDP by state 34 42 37932 Alabama Real GDP by state 15 327 Description 2004 2005 2006 2007 \ 37926 Support activities for mining 99 98 117 117 37951 Wholesale trade 9898 10613 10952 11034 37932 Nonmetallic mineral products manufacturing 980 968 940 1084 2008 2009 2010 2011 2012 2013 2014 37926 115 87 96 95 103 102 NaN 37951 11075 9722 9765 9703 9600 9884 10199.0 37932 861 724 714 701 589 641 NaN |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | print df.filter(like='20') 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 37926 99 98 117 117 115 87 96 95 103 102 (NA) 37951 9898 10613 10952 11034 11075 9722 9765 9703 9600 9884 10199 37932 980 968 940 1084 861 724 714 701 589 641 (NA) for col in df.filter(like='20').columns: df[col] = pd.to_numeric(df[col], errors='coerce') print df GeoName ComponentName IndustryId IndustryClassification \ 37926 Alabama Real GDP by state 9 213 37951 Alabama Real GDP by state 34 42 37932 Alabama Real GDP by state 15 327 Description 2004 2005 2006 2007 \ 37926 Support activities for mining 99 98 117 117 37951 Wholesale trade 9898 10613 10952 11034 37932 Nonmetallic mineral products manufacturing 980 968 940 1084 2008 2009 2010 2011 2012 2013 2014 37926 115 87 96 95 103 102 NaN 37951 11075 9722 9765 9703 9600 9884 10199.0 37932 861 724 714 701 589 641 NaN |
1 | df[cols] = pd.to_numeric(df[cols].stack(), errors='coerce').unstack() |
如果您要查找一系列列,可以尝试以下方法:
1 | df.iloc[7:] = df.iloc[7:].astype(float) |
上面的示例将type转换为float,因为所有列都以7开头到结尾。你当然可以使用不同的类型或不同的范围。
我认为当你有大量的列进行转换和很多行时,这很有用。它不会让你自己超越每一行 - 我相信numpy会更有效地做到这一点。
仅当您知道所有必需的列仅包含数字时才有用 - 它不会将"错误值"(如字符串)更改为NaN。