2014-01-06 2 views
6

Это моя ситуация -Pandas - Groupby и создайте новый DataFrame?

In[1]: data 
Out[1]: 
    Item     Type 
0 Orange   Edible, Fruit 
1 Banana   Edible, Fruit 
2 Tomato  Edible, Vegetable 
3 Laptop Non Edible, Electronic 

In[2]: type(data) 
Out[2]: pandas.core.frame.DataFrame 

То, что я хочу сделать, это создать кадр данных только Fruits, так что мне нужно groupby таким образом, что Fruit существует в Type.

Я попытался сделать это:

grouped = data.groupby(lambda x: "Fruit" in x, axis=1)

Я не знаю, если это способ сделать это, у меня немного трудное время понимание groupby. Как получить новый DataFrame только Fruits?

+1

стороне: ИМХО, шаг # 1 должен ломать свой «тип» вверх в (выбирающих лучшие имена, конечно) «Съедобность» и «Добродетель». Обычно лучше разбить столбцы так, как в самом начале, так как реальный столбец легче и безопаснее работать - избегает таких проблем, как «Не съедобный, определенно не плод», который содержит «Фрукты». – DSM

+0

@DSM Ofcourse, я не использую данные в реальном мире здесь. Это был лучший способ получить описание проблемы, соответствующее моим потребностям. В реальных данных, которые у меня есть, это довольно сложно, а «Тип» - произвольная CSV длины. – ComputerFellow

+1

Я не думал, что вы действительно работаете с данными о том, были ли бананы съедобными. ; ^) Стойкость точки: использование ограничения строки - это ошибка, ожидающая появления, даже если кажется, что это не проблема с вашими данными, потому что это не вызывает никаких проблем, пока это не произойдет. – DSM

ответ

6

Вы можете использовать

data[data['Type'].str.contains('Fruit')] 

import pandas as pd 

data = pd.DataFrame({'Item':['Orange', 'Banana', 'Tomato', 'Laptop'], 
        'Type':['Edible, Fruit', 'Edible, Fruit', 'Edible, Vegetable', 'Non Edible, Electronic']}) 
print(data[data['Type'].str.contains('Fruit')]) 

урожаи

 Item   Type 
0 Orange Edible, Fruit 
1 Banana Edible, Fruit 
+0

'x.str.contains ('something')' - Ницца! Мне действительно нужно запомнить векторизованные строковые функции панды. Они очень удобны. –

+1

'данные [данные.Тип.apply (lambda x: 'Fruit' in x)] 'выглядит чуть медленнее, чем' data [x.str.contains ('Fruit')] 'на моей машине (195 мкс за цикл против 209 мкс за цикл) , Так что 'str.contains' кажется просто синтаксическим сахаром. – unutbu

+0

Благодарим вас за то, что проинформировали меня об оптимизации! – ComputerFellow

5

groupby делает что-то совсем другое. Он создает группы для агрегации. В основном, это идет от чего-то вроде:

['a', 'b', 'a', 'c', 'b', 'b'] 

к чему-то вроде:

[['a', 'a'], ['b', 'b', 'b'], ['c']] 

Что вы хотите df.apply.

В более новых версиях pandas есть метод query, который делает это немного более эффективным и легким.

Однако один, что делать то, что вы хотите сделать булев массив, используя

mask = df.Type.apply(lambda x: 'Fruit' in x) 

А затем выбрать соответствующие части кадра данных с df[mask]. Или, как однострочника:

df[df.Type.apply(lambda x: 'Fruit' in x)] 

Как полный пример:

import pandas as pd 
data = [['Orange', 'Edible, Fruit'], 
     ['Banana', 'Edible, Fruit'], 
     ['Tomato', 'Edible, Vegtable'], 
     ['Laptop', 'Non Edible, Electronic']] 
df = pd.DataFrame(data, columns=['Item', 'Type']) 

print df[df.Type.apply(lambda x: 'Fruit' in x)] 
Смежные вопросы