Python pandas - получить строку на основе предыдущего значения строки - PullRequest
0 голосов
/ 11 июня 2018

У меня большой набор данных, в котором я пытаюсь отфильтровать только те строки, которые соответствуют определенным критериям.В частности, я хочу получить все строки, где Type == A if Type == B is 2

Так что в следующем примере это приведет к строке 2 Node-1 A 1

>>> import pandas as pd
>>> data = [['Node-0', 'A', 1],['Node-0', 'B', 1],['Node-1','A', 1],['Node-1', 'B', 2]]
>>> df = pd.DataFrame(data,columns=['Node','Type','Value'])
>>> print df
     Node Type  Value
0  Node-0    A     1
1  Node-0    B     1
2  Node-1    A     1
3  Node-1    B     2

Я могу отфильтровать строки, используя df.loc[df['Type'] == 'A'], но это дает мне строки 0 и 2.

Ответы [ 3 ]

0 голосов
/ 11 июня 2018

IIUC, используя некоторые маски с groupby.

m = df.Type.eq('B') & df.Value.eq(2)
df[m.groupby(df.Node).transform('any') & df.Type.eq('A')]

     Node Type  Value
2  Node-1    A      1
0 голосов
/ 11 июня 2018

Рассмотрим следующее:

# Get rows maching first criteria
dd1 = df[df.Type == 'A'][df.Value == 1]

# Get "previous" rows maching second criteria
df2 = df.shift(-1)
dd2 = df2[df2.Type == 'B'][df2.Value == 2]

# Find intersection
pd.merge(dd1, dd2, how='inner', on='Node')

Результат:

     Node Type_x  Value_x Type_y  Value_y
0  Node-1      A        1      B      2.0
0 голосов
/ 11 июня 2018

Могу поспорить, что есть лучшее решение, но на этот раз оно должно разобраться:

condition1 = (df['Node'].isin(df.query("Type=='B' & Value==2")['Node']))
#All the 'Node' values whose 'Type' and 'Value' columns have values 'B' and 2
#.isin() filters to rows that match the above criteria

condition2 = (df['Type']=='A')
#all the rows where 'Type' is 'A'

df.loc[condition1&condition2]
#intersection of above conditions    

#     Node Type  Value
#2  Node-1    A      1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...