2016-04-23 145 views
12

我用下面的df工作:大熊猫:to_numeric多个列

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) 

我要强制数字上的所有年:

c['2014'] = pd.to_numeric(c['2014'], errors='coerce') 

有一种简单的方法来做到这个还是我必须全部输入?

回答

12

UPDATE:你不需要你的价值观转换后,你可以做到这一点上的读你的CSV时-fly

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 - 使用下面的技巧:如果你

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:

样品来源DF:

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要选择全部stringobject)列使用以下简单的技巧:

cols = df.columns[df.dtypes.eq('object')] 
+0

感谢MaxU,对于你的答案:) –

+0

@MichaelPerdue中,很高兴帮助:) – MaxU

+0

为了完整:你也可以做转换初始化数据帧例如,当上了飞:pd.DataFrame(DataList控件,D型=浮动),它会将所有字段转换为可能的字段(并保持其他字段不变) – poppie

8

您可以使用:

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 

另一种解决方案与filter

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 
+0

谢谢,这工作:) –

+0

很高兴能帮助你!祝你好运! – jezrael

14

另一种方法是使用apply,一个内胆:

cols = ['col1', 'col2', 'col3'] 
data[cols] = data[cols].apply(pd.to_numeric, errors='coerce', axis=1) 
0

如果你正在寻找一个范围栏,你可以试试这个:以上

df.iloc[7:] = df.iloc[7:].astype(float) 

的例子将转换类型浮动,所有的列从第七个开始到结束。你当然可以使用不同的类型或不同的范围。

我认为这是有用的,当你有一个大范围的列转换和很多行。它不会让你自己走过每一排 - 我相信numpy会更有效率地做到这一点。

只有当你知道所有需要的列只包含数字时它才有用 - 它不会将“坏值”(如字符串)更改为NaN。