2015-07-30 14 views
5

Xin chào các bạn, giả sử tôi có dữ liệu về thời gian. Làm cách nào để lọc dữ liệu chỉ xảy ra trong 1 ngày khác nhau?Làm thế nào để lọc shift +/- 1 ngày trong Pandas?

Giả sử dữ liệu được

date   name 
2015-04-03 A 
2015-04-04 A 
2015-04-05 A 
2015-04-03 B 

Những gì tôi muốn làm là một cái gì đó giống như

df[df.shift(1).contains(df.name) or df.shift(-1).contains(df.name)] 

rằng sẽ cho tôi

date   name 
2015-04-03 A 
2015-04-04 A 
2015-04-05 A 

Làm thế nào để làm điều này trong gấu trúc?

+2

Bạn đang tìm kiếm kết hợp chính xác hay 'tên' thực sự 'chứa' hàng hiện tại 'tên' giá trị – EdChum

+0

tôi không hiểu câu hỏi, nhưng có vẻ như bạn muốn sử dụng 'groupby ('name')' ở đây và sau đó bất cứ điều gì khác bạn đang cố gắng làm. Có lẽ điều này? 'df.groupby ('name') ['date']. apply (lambda x: x == x.shift() + datetime.timedelta (1))' – JohnE

+1

Đây là một câu hỏi rất khó hiểu, tại sao nó lại có 5 upvotes?!? Mô tả, mã và kết quả đều khác nhau. Điều này thực sự phải được làm rõ bởi OP nếu có nhiều sự quan tâm trong câu hỏi và câu trả lời. – JohnE

Trả lời

0

Bạn muốn bao bọc các điều kiện trong dấu ngoặc đơn và sử dụng Bitwise | thay vì or:

In [83]: 
df[(df['name'].shift(1) == df['name']) | (df['name'].shift(-1) == df['name']) ] 

Out[83]: 
     date name 
0 2015-04-03 A 
1 2015-04-04 A 
2 2015-04-05 A 
1

Tôi sẽ sử dụng value_counts đối với ngày:

vc = df.date.value_counts() 

Sau đó, tôi sẽ, nếu dữ liệu là nhỏ, tôi sẽ sử dụng .isin:

df[df.date.isin(vc[vc == 1].index.tolist())] 

     date name 
1 2015-04-04 A 
2 2015-04-05 A 

Nếu tập dữ liệu lớn, tôi sẽ sử dụng hợp nhất hoạt động:

df_singles = df.merge(left_on='date',right=pd.DataFrame(vc[vc == 1]), right_index=True) 
del df_singles[0] 

     date name 
1 2015-04-04 A 
2 2015-04-05 A 
0

Chuyển đổi bạn ngày cột để đối tượng datetime. Sau đó, bạn có thể tính toán sự khác biệt giữa các ngày. Sau đó, bạn có thể lọc cho số ngày chênh lệch mà bạn muốn giữ lại

data['date'] = pd.to_datetime(data['date']) 
data['Diff'] = data['date'].diff() 
print data 

     date name Diff 
0 2015-04-03 A  NaT 
1 2015-04-04 A 1 days 
2 2015-04-05 A 1 days 
3 2015-04-03 B -2 days 

data_filtered = data[data['Diff'] == '1 days'] 
del data_filtered['Diff'] 
print data_filtered 

     date name 
1 2015-04-04 A 
2 2015-04-05 A 
Các vấn đề liên quan