2014-07-23 5 views
1

그래서 팬더를 사용하여 bool, int64 및 날짜 형식의 데이터 형식을 가진 데이터 프레임을 만들었습니다. 더 작은 데이터 세트의 경우 dtype은 유지되지만 더 큰 데이터 세트의 경우 팬더는이 모든 것을 객체로 변환합니다. 왜이 일을하는 이유와 내가 명시 적으로 유형을 설정할 수있는 방법을 아는 사람이 있습니까?팬더 열을 다른 dtype으로 변환

읽기 CSV : 나는이 정보를 인쇄 할 때

twitterDataFrame = pandas.read_csv(DataSetLocation) 

    twitterDataFrame['CreatedAt'] = twitterDataFrame['CreatedAt'].map(lambda x: pandas.to_datetime(x,dayfirst=True)) 
    twitterDataFrame['CreatedAtForCalculations'] = twitterDataFrame['CreatedAt'] 
    twitterDataFrame['InReplyToStatusID'] = twitterDataFrame['InReplyToStatusID'].map(lambda x: True if pandas.notnull(x) else False) 
    twitterDataFrame['InReplyToUserID'] = twitterDataFrame['InReplyToUserID'].map(lambda x: True if pandas.notnull(x) else False) 
    twitterDataFrame['RetweetCount'] = twitterDataFrame['RetweetCount'].map(lambda x: x if pandas.notnull(x) else 0) 
    twitterDataFrame['FavouriteCount'] = twitterDataFrame['FavouriteCount'].map(lambda x: x if pandas.notnull(x) else 0) 
    twitterDataFrame['Hashtags'] = twitterDataFrame['Hashtags'].map(lambda x: True if pandas.notnull(x) else False) 
    twitterDataFrame['URL'] = twitterDataFrame['URL'].map(lambda x: True if pandas.notnull(x) else False) 
    twitterDataFrame['MediaURL'] = twitterDataFrame['MediaURL'].map(lambda x: True if pandas.notnull(x) else False) 
    twitterDataFrame['MediaType'] = twitterDataFrame['MediaType'].map(lambda x: x if pandas.notnull(x) else False) 
    twitterDataFrame['UserMentionID'] = twitterDataFrame['UserMentionID'].map(lambda x: True if pandas.notnull(x) else False) 
    twitterDataFrame['PossiblySensitive'] = twitterDataFrame['PossiblySensitive'].map(lambda x: x if pandas.notnull(x) else 'NoData') 

이것은 내가 무엇을 얻을 수 있습니다. 작은 데이터 세트에 대한

None 
<class 'pandas.core.frame.DataFrame'> 
Int64Index: 21836 entries, 0 to 21835 
Data columns (total 17 columns): 
CreatedAt     21836 non-null object 
ActualTweet     21836 non-null object 
InReplyToStatusID   21836 non-null bool 
InReplyToUserID    21836 non-null bool 
UserID      21836 non-null object 
RetweetCount    21836 non-null object 
FavouriteCount    21836 non-null object 
Hashtags     21836 non-null bool 
URL       21836 non-null bool 
MediaURL     21836 non-null bool 
MediaType     21836 non-null object 
UserMentionID    21836 non-null bool 
PossiblySensitive   21836 non-null object 
Language     21836 non-null object 
Classifier     21836 non-null object 
TweetLength     21836 non-null object 
CreatedAtForCalculations 21836 non-null object 
dtypes: bool(6), object(11)None 

그러나이 예상대로 작동하고 우리가 얻을 :이 왜

None 
<class 'pandas.core.frame.DataFrame'> 
Int64Index: 8978 entries, 0 to 8977 
Data columns (total 17 columns): 
CreatedAt     8978 non-null datetime64[ns] 
ActualTweet     8978 non-null object 
InReplyToStatusID   8978 non-null bool 
InReplyToUserID    8978 non-null bool 
UserID      8978 non-null int64 
RetweetCount    8978 non-null int64 
FavouriteCount    8978 non-null int64 
Hashtags     8978 non-null bool 
URL       8978 non-null bool 
MediaURL     8978 non-null bool 
MediaType     8978 non-null object 
UserMentionID    8978 non-null bool 
PossiblySensitive   8978 non-null object 
Language     8978 non-null object 
Trustworthy     8978 non-null int64 
TweetLength     8978 non-null int64 
CreatedAtForCalculations 8978 non-null datetime64[ns] 
dtypes: bool(6), datetime64[ns](2), int64(5), object(4)None 

는 아는 사람 것이며, 내가 그것을 해결하기 위해 무엇을 할 수 있는가?

+0

더 큰 세트에는 변환 할 수없는 값이있을 수 있습니다. – furas

+0

물론 대다수 데이터 유형이 아닌 값을 무시하도록 만드는 방법은 무엇입니까? – user2233834

+2

여기를 참조하십시오 : http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.convert_objects.html?highlight=convert_objects#pandas.DataFrame.convert_objects를 사용하면 datetime-like 및 numberic과 같이 non-convertibles를''nan''으로 설정하여 명시 적으로''object'' 컬럼을 강제 실행할 수 있습니다. ''df [columns_that_should_be_datetimes] .convert_objects (convert_dates = 'force')'' – Jeff

답변

2

에 다른 기능을 실행합니다. 일반적으로 read_csv이 전환을 수행 할 때 이와 같은 작업을 수행하지 않아도됩니다. 그러나 값이 섞인다면 이러한 변환은 실패 할 수 있습니다.

는 날짜 시간 및 숫자처럼 '보이는'열을 변환합니다 문서

In [13]: data = """21-01-2014,1 
    ....: 31x01x2014,foo 
    ....: 01-01-2014,2 
    ....: hello,3""" 

In [14]: df = pd.DataFrame.from_csv(StringIO(data), index_col=None, header=None) 

In [15]: df 
Out[15]: 
      0 1 
0 21-01-2014 1 
1 31x01x2014 foo 
2 01-01-2014 2 
3  hello 3 

In [16]: df.dtypes 
Out[16]: 
0 object 
1 object 
dtype: object 

In [17]: df.convert_objects(convert_dates='coerce',convert_numeric=True) 
Out[17]: 
      0 1 
0 2014-01-21 1 
1  NaT NaN 
2 2014-01-01 2 
3  NaT 3 

In [18]: df.convert_objects(convert_dates='coerce',convert_numeric=True).dtypes 
Out[18]: 
0 datetime64[ns] 
1   float64 
dtype: object 

here를 참조하십시오. 이 기능을 특정 열로 제한하고 좀 더 선택적으로 사용할 수 있습니다. object 유형 열만 시도합니다. 또한 이것은 cython으로 구현되므로 매우 빠를 것입니다.

+0

예. 고맙습니다 :) – user2233834

1

아마도 변환 할 수없는 값을 찾는 더 좋은 해결책이있을 것입니다. 내가 잘못된 날짜를 잡아 (인쇄)하는 datetime.datetime.strptime()try/except를 사용하는 함수를 만들

import pandas as pd 
from StringIO import StringIO 

data = '''21-01-2014 
31x01x2014 
01-01-2014 
"Hello World"''' 

df = pd.DataFrame.from_csv(StringIO(data), index_col=None, header=None) 

print df 

''' 
      0 
0 21-01-2014 
1 31x01x2014 
2 01-01-2014 
3 Hello World 
''' 

:

그것은 시험 apply()

내 데이터를 사용하여 내 솔루션입니다.

from datetime import datetime 

def test_datetime(x): 
    try: 
     datetime.strptime(x, "%d-%M-%Y") 
    except: 
     print 'incorect:', x 

다음

from datetime import datetime 

def test_datetime(x): 
    try: 
     datetime.strptime(x, "%d-%M-%Y") 
     return False 
    except: 
     return True 

이이 방법을 사용하여 인덱스 데이터를 가져 오기 위해 나는 열

df[0].apply(test_datetime) 

''' 
incorect: 31x01x2014 
incorect: Hello World 
''' 

모든 값을 테스트 apply()를 사용하지만 이전 기능에 return True/False을 추가 할 수 있습니다

print df[ df[0].apply(test_datetime) ] 

''' 
      0 
1 31x01x2014 
3 Hello World 
''' 

하고 여기에 더 유용 뭔가 object에서 이미 존재하는 프레임의 열을 변환하는 좋은 방법이 행

df[ df[0].apply(test_datetime) ] = '01-01-2000' 

print df 

''' 
      0 
0 21-01-2014 
1 01-01-2000 
2 01-01-2014 
3 01-01-2000 
''' 
관련 문제