2015-08-31 2 views
0

У меня есть панда DataFrame, который я хотел бы сгруппировать по подстрокам одного из столбцов. Подстроки приведены в другой серии панд (или в списке). Я пробовал несколько вещей, но я просто не могу заставить его работать.pandas groupby из DataFrame с использованием серии подстрок

у меня есть это:

tst = pd.DataFrame({'id': [0, 11, 222, 3333, 44444], 
        'bla': ['ab', 'ba', 'ca', 'bc', 'db']}) 
test = pd.Series(['a', 'b', 'c', 'd']) 

Я хотел бы группа tst в зависимости от того 'а', 'б', 'с', 'd' (от test) содержится в tst['bla'].

ответ

0

df.apply() лучший здесь.

import pandas as pd 
def funcx(x, test_str): 
    return test_str in x['bla'] 


tst = pd.DataFrame({'id': [0, 11, 222, 3333, 44444], 
       'bla': ['ab', 'ba', 'ca', 'bc', 'db']}) 
test = pd.Series(['a', 'b', 'c', 'd']) 
result = {} 
for xstring in test: 
    result[xstring] = tst.apply(funcx, args=(xstring), axis=1) 

print result 

дает нам;

{'a': 0  True 
1  True 
2  True 
3 False 
4 False 
dtype: bool, 'c': 0 False 
1 False 
2  True 
3  True 
4 False 
dtype: bool, 'b': 0  True 
1  True 
2 False 
3  True 
4  True 
dtype: bool, 'd': 0 False 
1 False 
2 False 
3 False 
4  True 
dtype: bool} 

это может быть использовано для выбора соответствующих строк;

>>print tst[result['a']] 
    bla id 
    0 ab 0 
    1 ba 11 
    2 ca 222 
+0

более элегантно, чем функции применяются, чтобы использовать 'результат [xstring] = tst.bla.str.contains (xstring)' – Pilik

+0

Спасибо за решения. Сначала я был немного обеспокоен тем, что мои реальные данные (20M csv-файлов) займут много времени, чтобы работать с циклом for, но это было очень быстро. Первоначально я надеялся на какую-то однострочную магию панд, но это хорошее и простое решение. Благодаря! – tinux