소비 isin
하지가 T
또는 X
값이 :
import pandas as pd
df = pd.DataFrame({"ID":["AA-1", "AA-1", "C-0" ,"BB-2", "BB-2"],
"symbol":["A","A","C","B","B"],
"date":["06/24/2014","06/24/2014","06/20/2013","06/25/2015","06/25/2015"],
"message": ["T","X","T","",""] })
print (df)
ID date message symbol
0 AA-1 06/24/2014 T A
1 AA-1 06/24/2014 X A
2 C-0 06/20/2013 T C
3 BB-2 06/25/2015 B
4 BB-2 06/25/2015 B
df1 = df.groupby(['ID','date','symbol']).filter(lambda x: ~((len(x) == 2) &
(x.message.isin(['T','X']).all())))
print (df1)
ID date message symbol
2 C-0 06/20/2013 T C
3 BB-2 06/25/2015 B
4 BB-2 06/25/2015 B
Filtration in docs합니다.
편집 comment의 :
import pandas as pd
df = pd.DataFrame({"ID":["AA-1", "AA-1", "C-0", "C-0","BB-2", "BB-2"],
"symbol":["A","A","C","C", "B","B"],
"date":["06/24/2014","06/24/2014","06/20/2013","06/20/2013","06/25/2015","06/25/2015"],
"message": ["T","X","X","X","",""] })
print (df)
ID date message symbol
0 AA-1 06/24/2014 T A
1 AA-1 06/24/2014 X A
2 C-0 06/20/2013 X C
3 C-0 06/20/2013 X C
4 BB-2 06/25/2015 B
5 BB-2 06/25/2015 B
각 그룹의 X
또는 T
와 값을 제거해야하는 경우 - 그것은 이중 X
거나 이중 T
을 제거하는 것을 의미하고 각 그룹의 각 len
항상 2
입니다 :
을
df1 = df.groupby(['ID','date','symbol']).filter(lambda x: ~x.message.isin(['T','X']).all())
print (df1)
ID date message symbol
4 BB-2 06/25/2015 B
5 BB-2 06/25/2015 B
값이 T
및 X
인 그룹 만 제거해야하는 경우 각각의 그룹에서 첫 번째 값이 T
이고 두 번째 값이 X
인지 확인하여 먼저 sort_values
을 message
, 그 다음 filter
으로 지정할 수 있습니다. ('T'는 첫 번째와 정렬 때문에 X
는 두 번째) :
df2 = df.sort_values('message')
.groupby(['ID','date','symbol'], sort=False)
.filter(lambda x: ((x.message.iloc[0] != 'T') | (x.message.iloc[1] != 'X')))
print (df2)
ID date message symbol
4 BB-2 06/25/2015 B
5 BB-2 06/25/2015 B
2 C-0 06/20/2013 X C
3 C-0 06/20/2013 X C
2 개 이상인 경우에 대비하여 중복 행을 유지 하시겠습니까? – Stefan
아마도 내 질문에 더 분명하게해야합니다. 내 데이터는 쌍으로 제공됩니다.모든 "X"행에는 "메시지"열을 제외하고 다른 열이 동일한 정확히 "T"행 하나가 있습니다 (또는 적어도 있어야합니다). 이 경우 적어도 데이터가 정확하게 수집 된 경우 일치하는 관측 쌍이 있어야합니다. – dleal