2016-04-23 31 views
12

Tôi đang làm việc với các df sau:gấu trúc: to_numeric cho nhiều cột

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) 

Tôi muốn buộc số trên tất cả các năm:

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

là có một cách dễ dàng để làm này hay tôi phải gõ tất cả chúng ra?

Trả lời

12

UPDATE: bạn không cần phải chuyển đổi giá trị của bạn sau đó, bạn có thể làm điều đó on-the -fly khi đọc CSV của bạn:

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 

Nếu bạn cần phải chuyển đổi nhiều cột để dtypes số - sử dụng kỹ thuật sau đây:

Sample nguồn 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 

Chuyển đổi cột được lựa chọn để dtypes số:

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 nếu bạn muốn chọn tất cả các cộtstring (object) sử dụng thủ thuật đơn giản sau đây:

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

Cảm ơn MaxU, cho cả hai câu trả lời của bạn :) –

+0

@MichaelPerdue, vui lòng trợ giúp :) – MaxU

+0

Để hoàn thành: Bạn cũng có thể thực hiện chuyển đổi khi đang khởi tạo một khung dữ liệu ví dụ: pd.DataFrame (datalist, dtype = float), mà sẽ chuyển đổi tất cả các lĩnh vực để nổi nếu có thể (và để những người khác không thay đổi) – poppie

8

Bạn có thể sử dụng:

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 

Một giải pháp khác với 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

Cảm ơn bạn, điều này đã làm việc :) –

+0

Vui mừng có thể giúp bạn! Chúc may mắn! – jezrael

14

một cách khác là sử dụng apply, lót:

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

Nếu bạn đang tìm kiếm một loạt các cột, bạn có thể thử này:

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

Những ví dụ trên sẽ chuyển đổi các loại để được nổi, cho tất cả các cột bắt đầu với 7 đến cuối. Bạn tất nhiên có thể sử dụng loại khác nhau hoặc phạm vi khác nhau.

Tôi nghĩ điều này hữu ích khi bạn có nhiều cột để chuyển đổi và nhiều hàng. Nó không làm cho bạn đi qua từng hàng một mình - Tôi tin rằng gumpy làm điều đó hiệu quả hơn.

Điều này chỉ hữu ích nếu bạn biết rằng tất cả các cột bắt buộc chỉ chứa số - nó sẽ không thay đổi "giá trị xấu" (như chuỗi) thành NaN cho bạn.

Các vấn đề liên quan