2016-10-07 6 views
0

Представьте себе, если у вас есть список строк и панд dataframe с колонки Foo, который имеет слова, которые могут содержать такие строки:панды GroupBy список строк

my_list = ['A', 'B', 'C']

ФР [ «Foo»] имеет слова, содержащие «A» или «B» или «C»,

вы можете извлечь те, которые содержат df.Foo.str.contains(my_list[0]) и т. д., но можете ли вы группировать по строкам, которые соответствуют списку? Так GroupBy будет по содержит 'A' или 'B' или 'C'

+0

Вы хотите, чтобы слова отображались в нескольких группах? Например, у абракадабры есть все три, так должно ли оно появляться во всех трех группах? А если нет, есть ли одно письмо, которое имеет преимущество над другим? – TheF1rstPancake

+1

Предположим (для начала) Foo содержит только одно из трех слов – Drew

+0

Имеет ли значение вопрос? –

ответ

0

Да, вы можете сделать это, передав функцию GroupBy()

data = {'Foo': {0: 'apple', 
    1: 'body', 
    2: 'animal', 
    3: 'cot', 
    4: 'cord', 
    5: 'bed', 
    6: 'ant'}} 

df = pd.DataFrame(data) 
print (df) 

     Foo 
0 apple 
1 body 
2 animal 
3  cot 
4 cord 
5  bed 
6  ant 

get_grp() будет вызываться для каждое значение в df ['Foo']. Примечание: х только индекс ДФ, поэтому мы должны передать некоторые дополнительные вещи

def get_grp(x, df, col_name, my_list): 
    for c in my_list: 
     if c in df[col_name][x]: 
      return c 


my_list = ['a', 'b', 'c'] 
g = df.groupby(lambda x : get_grp(x, df, 'Foo', my_list)) 
print (type(g)) 
print (g.count()) 

<class 'pandas.core.groupby.DataFrameGroupBy'> 
    Foo 
a 3 
b 2 
c 2 

Примечание: get_grp() возвращает только один элемент my_list. Таким образом, «Бал» попадает только в одну группу, и это будет «а», потому что его первый элемент в my_list мы проверяем.