私は2つの列を持つデータフレームを持っています: "エージェント"と "クライアント" 各行はエージェントとクライアント間の対話に対応しています。パンダのデータフレームに重複した行だけを保持
クライアントが少なくとも2つのエージェントと対話していた場合は、その行だけを残したいと思っています。
どうすればいいですか?
私は2つの列を持つデータフレームを持っています: "エージェント"と "クライアント" 各行はエージェントとクライアント間の対話に対応しています。パンダのデータフレームに重複した行だけを保持
クライアントが少なくとも2つのエージェントと対話していた場合は、その行だけを残したいと思っています。
どうすればいいですか?
groupby
およびtransform
をvalue_counts
とする。
df[df.Agent.groupby(df.Agent).transform('value_counts') > 1]
mentioned hereとして、あなたは同じクライアントで複数回の対話エージェントを1つ持っているかもしれない、という注意、。これは偽陽性として保持される可能性があります。あなたはこれをしたくない場合は、フィルタリングの前drop_duplicates
コールを追加することができます。
df = df.drop_duplicates()
df = df[df.Agent.groupby(df.Agent).transform('value_counts') > 1]
print(df)
A B
0 1 2
1 2 5
2 3 1
3 4 1
4 5 5
5 6 1
mask = df.B.groupby(df.B).transform('value_counts') > 1
print(mask)
0 False
1 True
2 True
3 True
4 True
5 True
Name: B, dtype: bool
df = df[mask]
print(df)
A B
1 2 5
2 3 1
3 4 1
4 5 5
5 6 1
OPには言及されていませんが、(おそらくは間違っていると思われる)単一のエージェントとのやりとりが繰り返されている場合に対応したいかもしれません。グループ化する前に '.drop_duplicates()'をスローしたいかもしれません... –
@JonClements確かに、妥当なと思われます。に追加されました。 –
これを行うには、パンダにして、グループを使用する必要があります。https://pandas.pydata.org/pandas -docs/stable/generated/pandas.DataFrame.groupby.html –