Поиск пар строк с соответствующими подстроками столбцов в панде - PullRequest
0 голосов
/ 17 октября 2019

У меня есть датафрейм с несколькими столбцами. Одна из них называется 'log_text'. Я хочу найти пары строк, которые имеют совпадающие строки в этом столбце.

Например, если 'log_text' имеет эти строки

 Device remove ID#xxx  
 Device remove ID#yyy  
 Device remove ID#zzz  
 Device arrive ID#xxx  
 Device arrive ID#yyy 
 Device arrive ID#zzz 

Цель:Я хотел бы получить строки, содержащие 'Device remove ID#xxx' и 'Device arrive ID#xxx' и иметь возможность делать вещи с другими столбцами, а затем повторить это для строк, содержащих 'Device remove ID#yyy' и 'Device arrive ID#yyy' и т. Д.

Что япытался использовать iterrows(), найти ID# текущей строки, удалить эту строку из таблицы и найти первую строку, содержащую соответствующую строку ID #.

    for index, row in temp_df.iterrows():
        log_string = row['log_text']
        id_text = log_string.partition("ID#")[2]
        temp_df.drop(row)
        match = temp_df[temp_df['log_text'].str.contains(id_text)]
        # Somehow stash the 2 rows together somewhere? 
            # like stash[index,1] = row; stash[index,2] = match;
        temp_df.drop(match)

Ответы [ 3 ]

2 голосов
/ 17 октября 2019

Вы можете использовать pandas.Series.str.split и pandas.groupby :

In [10]: df = pd.DataFrame({'log':['Device remove ID#xxx',
    ...:                           'Device remove ID#yyy',
    ...:                           'Device remove ID#zzz',
    ...:                           'Device arrive ID#xxx',
    ...:                           'Device arrive ID#yyy',
    ...:                           'Device arrive ID#zzz',],
                            'other_row':[1,2,3,42,54,6]})

In [11]: df
Out[11]:
                    log  other_row
0  Device remove ID#xxx          1
1  Device remove ID#yyy          2
2  Device remove ID#zzz          3
3  Device arrive ID#xxx         42
4  Device arrive ID#yyy         54
5  Device arrive ID#zzz          6

In [14]: df_splits = df['log'].str.split(expand=True)

In [16]: df['action'] = df_splits[1]

In [17]: df['user'] = df_splits[2]

In [18]: df
Out[18]:
                    log  other_row  action    user
0  Device remove ID#xxx          1  remove  ID#xxx
1  Device remove ID#yyy          2  remove  ID#yyy
2  Device remove ID#zzz          3  remove  ID#zzz
3  Device arrive ID#xxx         42  arrive  ID#xxx
4  Device arrive ID#yyy         54  arrive  ID#yyy
5  Device arrive ID#zzz          6  arrive  ID#zzz


In [22]: for i, d in df.groupby('user'):
    ...:     print i
    ...:     print d
    ...:     print d['other_row'].sum()
    ...:     print
    ...:
    ...:
ID#xxx
                    log  other_row  action    user
0  Device remove ID#xxx          1  remove  ID#xxx
3  Device arrive ID#xxx         42  arrive  ID#xxx
43

ID#yyy
                    log  other_row  action    user
1  Device remove ID#yyy          2  remove  ID#yyy
4  Device arrive ID#yyy         54  arrive  ID#yyy
56

ID#zzz
                    log  other_row  action    user
2  Device remove ID#zzz          3  remove  ID#zzz
5  Device arrive ID#zzz          6  arrive  ID#zzz
9
1 голос
/ 17 октября 2019

IIUC,

Я думаю, вы можете использовать .str.count и .loc для выполнения дальнейших операций

, например:

rows_to_filter = ['Device remove ID#xxx','Device remove ID#yyy',
'Device remove ID#zzz','Device arrive ID#xxx',
'Device arrive ID#yyy','Device arrive ID#zzz']

df.loc[df['log_text'].str.count('|'.join(rows_to_filter)) > 1, 'col'] = 'do something'

Это вернет фрейм данныхЕсли в каждой строке есть что-то, имеющее более одного вхождения из вашего списка выше, вам, возможно, придется повозиться с логикой, поскольку я не на 100% то, что вам нужно без примера вывода.

0 голосов
/ 17 октября 2019

Если вам нужно сохранить исходный столбец и просто отсортировать последние 3 символа, вы можете создать отдельный столбец только для этой цели.

df1['group'] = df1['log_text'].str[-3::]

Это создаст копию столбца 'log_text', но сохранит только последние три символа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...