2016-03-12 28 views
6

Tôi đang cố gắng kiểm tra xem một giá trị nhất định có được chứa trong cột python hay không. Tôi đang sử dụng df.date.isin(['07311954']), mà tôi không nghi ngờ là một công cụ tốt. Vấn đề là tôi có hơn 350 nghìn hàng và đầu ra sẽ không hiển thị tất cả chúng để tôi có thể xem liệu giá trị có thực sự được chứa hay không. Nói một cách đơn giản, tôi chỉ muốn biết (Y/N) có hay không một giá trị cụ thể được chứa trong một cột. Mã của tôi sau:Kiểm tra xem giá trị nhất định có được chứa trong cột dataframe trong gấu trúc

import numpy as np 
import pandas as pd 
import glob 


df = (pd.read_csv('/home/jayaramdas/anaconda3/Thesis/FEC_data/itpas2_data/itpas214.txt',\ 
    sep='|', header=None, low_memory=False, names=['1', '2', '3', '4', '5', '6', '7', \ 
    '8', '9', '10', '11', '12', '13', 'date', '15', '16', '17', '18', '19', '20', \ 
    '21', '22'])) 

df.date.isin(['07311954']) 

Trả lời

6

tôi nghĩ rằng bạn cần str.contains, nếu bạn cần hàng nơi giá trị của cột date chứa chuỗi 07311954:

print df[df['date'].astype(str).str.contains('07311954')] 

Hoặc nếu type của date cột là string:

print df[df['date'].str.contains('07311954')] 

Nếu bạn muốn kiểm tra 4 chữ số cuối cùng cho string1954 trong cột date:

print df[df['date'].astype(str).str[-4:].str.contains('1954')] 

mẫu:

print df['date'] 
0 8152007 
1 9262007 
2 7311954 
3 2252011 
4 2012011 
5 2012011 
6 2222011 
7 2282011 
Name: date, dtype: int64 

print df['date'].astype(str).str[-4:].str.contains('1954') 
0 False 
1 False 
2  True 
3 False 
4 False 
5 False 
6 False 
7 False 
Name: date, dtype: bool 

print df[df['date'].astype(str).str[-4:].str.contains('1954')] 
    cmte_id trans_typ entity_typ state employer occupation  date \ 
2 C00119040  24K  CCM MD  NaN   NaN 7311954 

    amount  fec_id cand_id 
2 1000 C00140715 H2MD05155 
+0

Tôi nghĩ bạn, tôi đã chạy mã được đề xuất của bạn và tôi vẫn nhận được danh sách rất dài và không đầy đủ. –

+0

Tôi chỉ chạy nó, tôi đã có một số lỗi cú pháp trước đó nên dừng lại để nghỉ ngơi. Khi tôi chạy mã ở trên nó chỉ ra ngày 1954; nhưng khi tôi chạy mã trên cùng một tập dữ liệu sau khi đã thực hiện (http: // stackoverflow.com/questions/35939558/using-timegrouper-1m-to-group-and-sum-by-cột-is-messing-up-my-date-index-p/35957110 # 35957110) nó trả về 'Empty DataFrame Cột: [cmte_id, trans_typ, entity_typ, state, date, amount, fec_id, cand_id] Chỉ mục: [] ' –

+0

Jezrael, tôi sẽ xem lại các tệp dữ liệu và xem có bao nhiêu tệp có thị trường cột ngày với ngày đó là "ngoài phạm vi". Về mặt lý thuyết, tất cả các ngày của tôi phải từ năm 2007 đến năm 2014. Có cách nào để sử dụng mã mà bạn đã đăng ở trên nhưng in tất cả các giá trị với 4 chữ số cuối trong khoảng từ năm 2007 đến 2014? Tôi cũng muốn xóa tất cả các hàng xảy ra như vậy, nhưng trước tiên tôi cần định vị chúng để tôi có thể thông báo nguồn dữ liệu của lỗi trong dữ liệu. Nếu bạn có thể giúp tôi với điều đó nó sẽ là tuyệt vời! –

12

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

print any(df.column == 07311954) 
True  #true if it contains the number, false otherwise 

Nếu bạn chứ không phải muốn xem bao nhiêu lần '07.311.954' xảy ra trong một cột bạn có thể sử dụng:

df.column[df.column == 07311954].count() 
+0

Cảm ơn bạn; hoạt động! –

10

Bạn có thể chỉ cần sử dụng này:

'07311954' in df.date.values trả về True hoặc False


Dưới đây là giải thích thêm:

Trong gấu trúc, sử dụng in kiểm tra trực tiếp với DataFrame và Series (ví dụ val in df hoặc val in series) sẽ kiểm tra xem val có được chứa trong Chỉ số Chỉ số hay không.

NHƯNG bạn vẫn có thể sử dụng in kiểm tra giá trị của chúng quá (thay vì chỉ mục)! Chỉ cần sử dụng val in df.col_name.values hoặc val in series.values. Bằng cách này, bạn đang thực sự kiểm tra val với một mảng Numpy.

.isin(vals) là một cách khác xung quanh, nó sẽ kiểm tra xem các giá trị DataFrame/Series có nằm trong số số vals hay không. Ở đây vals phải là bộ hoặc danh sách giống như. Vì vậy, đây không phải là cách tự nhiên để đi cho câu hỏi.

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