2016-05-21 5 views
2

Я пытаюсь отфильтровать несколько лет в моей очень большой кадре данных.
Это очень короткий и простой вариант моих данных:Отфильтровать данные в большом массиве данных панд

Year Value Symbol 
2001 0.1  ABC 
2002 0.1  ABC 
2003 0.2  ABC 
2002 0.4  ZZZ 
2003 0.8  ZZZ 
2000 0.9  ASD 
2001 0.1  ASD 
2002 0.3  ASD 
2003 0.2  ASD 

Как вы можете видеть различные символы имеют разный отправной год в моем наборе данных. Например, символ ASD имеет первое значение в 2000 году, а символ ZZZ - только в 2002 году. В этом конкретном случае я хотел бы только сохранить данные в течение многих лет, когда все символы имеют свою ценность. Результат должен выглядеть следующим образом:

Year Value Symbol 
2002 0.1  ABC 
2003 0.2  ABC 
2002 0.4  ZZZ 
2003 0.8  ZZZ 
2002 0.3  ASD 
2003 0.2  ASD 

проблема с моим большим dataframe является то, что у меня есть много дат и я не знаю дату начала для каждого символа (и у меня есть много символов). Поэтому я должен сначала найти дату начала каждого символа (или символ с последней стартовой датой), а затем удалить все ненужные данные. Есть ли способ эффективно делать это в pandas/python?

ответ

4

Вы можете использовать pivot, затем dropna и unstack:

df = df.pivot(index='Year', columns='Symbol', values='Value') 
     .dropna() 
     .unstack() 
     .reset_index(name='Value') 

print (df) 
    Symbol Year Value 
0 ABC 2002 0.1 
1 ABC 2003 0.2 
2 ASD 2002 0.3 
3 ASD 2003 0.2 
4 ZZZ 2002 0.4 
5 ZZZ 2003 0.8 
2

Вы должны разделить ваш текущий код, чтобы получить более информативные предложения по повышению эффективности; вот один простой подход: Узнайте, сколько уникальных символов есть, и сохраняйте только те годы, у которых есть точно столько уникальных символов.

import pandas as pd 
from io import StringIO 

df = pd.read_csv(StringIO(
'''Year Value Symbol 
2001 0.1  ABC 
2002 0.1  ABC 
2003 0.2  ABC 
2002 0.4  ZZZ 
2003 0.8  ZZZ 
2000 0.9  ASD 
2001 0.1  ASD 
2002 0.3  ASD 
2003 0.2  ASD'''), sep=r' +') 

unique_symbol_count = df.Symbol.value_counts().keys().shape[0] 
good_years_df = df.groupby('Year').filter(lambda gp: gp.Symbol.value_counts().shape[0] == unique_symbol_count) 

# Year Value Symbol 
# 1 2002 0.1 ABC 
# 2 2003 0.2 ABC 
# 3 2002 0.4 ZZZ 
# 4 2003 0.8 ZZZ 
# 7 2002 0.3 ASD 
# 8 2003 0.2 ASD 
Смежные вопросы