2015-10-05 13 views
6

Chciałbym użyć pandas, aby usunąć wiersze na podstawie nazwy kolumny (zawierającej spację) i wartości komórki. Próbowałem różnych sposobów, aby to osiągnąć (metody drop i query), ale wydaje mi się, że zawodzę z powodu spacji w nazwie. Czy istnieje sposób sprawdzania danych przy użyciu nazwy, która zawiera spację lub czy muszę najpierw wyczyścić wszystkie spacje?Zapytanie DataFrame Pand o nazwę kolumny zawierającą spację lub metodę upuszczania z nazwą kolumny zawierającą spację.

dane w postaci csv

Date,"price","Sale Item" 
2012-06-11,1600.20,item1 
2012-06-12,1610.02,item2 
2012-06-13,1618.07,item3 
2012-06-14,1624.40,item4 
2012-06-15,1626.15,item5 
2012-06-16,1626.15,item6 
2012-06-17,1626.15,item7 

Attempt Przykłady

df.drop(['Sale Item'] != 'Item1') 
df.drop('Sale Item' != 'Item1') 
df.drop("'Sale Item'] != 'Item1'") 

df.query('Sale Item' != 'Item1') 
df.query(['Sale Item'] != 'Item1') 
df.query("'Sale Item'] != 'Item1'") 

błędów przesłane w większości przypadków

ImportError: 'numexpr' not found. Cannot use engine='numexpr' for query/eval if 'numexpr' is not installed 

Odpowiedz

5

Jeśli dobrze zrozumiałam swój problem, może można po prostu zastosować filtr jak:

df = df[df['Sale Item'] != 'item1'] 

która zwraca:

  Date price Sale Item 
1 2012-06-12 1610.02  item2 
2 2012-06-13 1618.07  item3 
3 2012-06-14 1624.40  item4 
4 2012-06-15 1626.15  item5 
5 2012-06-16 1626.15  item6 
6 2012-06-17 1626.15  item7 
+0

To będzie działać, jeśli nie otrzymasz odpowiedzi za pomocą metody drop chętnie przyjmuję to jako pracę wokół. Dziękuję Fabio – iNoob

+0

@iNoob Dlaczego potrzebujesz metody używając 'drop'? –

+0

Bo id woli, jeśli istnieje – iNoob

4

Jak widać z the documentation -

DataFrame. upuść (etykiety, oś = 0, poziom = brak, inplace = fałsz, błędy = "podniesienie")

Powrót nowy obiekt z etykiet osi żądanych usunięte

DataFrame.drop() bierze index wierszy spadać, a nie warunek. Stąd byś najprawdopodobniej trzeba coś podobnego -

df.drop(df.ix[df['Sale Item'] != 'item1'].index) 

Uwaga, to spada wiersze spełniające warunek, więc wynik byłby wiersze, które nie spełniają warunku, jeśli chcesz coś przeciwnego co możliwe użyj operatora ~ przed swoim warunkiem, aby go negować.

Ale wydaje się to trochę za dużo, łatwiej byłoby po prostu użyć indeksowania Boole'a, aby uzyskać żądane wiersze (jak wskazano w drugiej odpowiedzi).


Demo -

In [20]: df 
Out[20]: 
     Date price Sale Item 
0 2012-06-11 1600.20  item1 
1 2012-06-12 1610.02  item2 
2 2012-06-13 1618.07  item3 
3 2012-06-14 1624.40  item4 
4 2012-06-15 1626.15  item5 
5 2012-06-16 1626.15  item6 
6 2012-06-17 1626.15  item7 

In [21]: df.drop(df.ix[df['Sale Item'] != 'item1'].index) 
Out[21]: 
     Date price Sale Item 
0 2012-06-11 1600.2  item1 
+0

Dzięki za odpowiedź Anand. Czy możesz wyjaśnić, dlaczego odpowiedź Fabio jest lepsza niż metoda drop? Jak rozumiem, metoda kropli została opracowana właśnie w tym celu? Nie zrozumcie mnie źle, a Fabio są znacznie bardziej doświadczeni niż ja. Próbuję się tylko od ciebie uczyć i rozumiem, dlaczego uważasz, że jest to lepsza opcja. – iNoob

+0

Dla mnie druga metoda wygląda na krótszą. Jedyną zaletą, którą widzę dla metody 'drop' jest to, że ma argument lokalny, który może być użyty do zmiany ramki danych w miejscu. –

+0

Ok, teraz mam czas, aby użyć obu i faktycznie znalazłem odpowiedź Fabio na bardziej użyteczną. Teraz mam problem z zaakceptowaniem odpowiedzi. Twoje odpowiedzi bezpośrednio na moje pytanie, ale Fabio znalazłem bardziej użyteczny. – iNoob

Powiązane problemy