- 条件がある - グループ内の重複した値と列message
でない2
行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によってEDIT:
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
のグループのみを削除する必要がある場合は、最初にをmessage
とし、次にfilter
とすると、最初の値がT
で、2番目がX
であるかどうかを確認することができます。 ( 'T' は、第1であると仕分けので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」行には、「メッセージ」列を除いて他の列が等しい、正確に1つの「T」行が存在する(または少なくともあるはずである)。この場合、少なくともデータが正しく収集されていれば、一致する観測のペアのみが存在する必要があります。 – dleal