4

Python 3.3 と Pandas 0.10 の使用

複数の CSV ファイルを連結して構築された DataFrame があります。まず、特定の文字列を含む Name 列のすべての値を除外します。結果は次のようになります (簡潔にするために短縮されていますが、実際にはさらに列があります)。

Name    ID
'A'     1
'B'     2
'C'     3
'C'     3
'E'     4
'F'     4
...     ...

今私の問題は、「重複」値の特別なケースを削除したいということです。この ID にマップされている対応する Name 値が類似していないすべての ID 重複 (実際には行全体) を削除したいと考えています。上記の例では、ID 1、2、および 3 の行を保持したいと考えています。ID=4 の場合、名前の値は等しくないため、それらを削除したいと考えています。

次のコード行を使用しようとしました (ここでの提案に基づいて: Python Pandas: remove entrys based on the number of occuring )。

コード:

df[df.groupby('ID').apply(lambda g: len({x for x in g['Name']})) == 1]

しかし、それは私にエラーを与えます: ValueError: Item wrong length 51906 instead of 109565!

編集:

を使用する代わりに、apply()も使用しtransform()てみましたが、エラーが発生します: AttributeError: 'int' object has no attribute 'ndim'。関数ごとにエラーが異なる理由についての説明は、非常にありがたいです!

また、上記の例で ID = 3 のすべての行を保持したいと考えています。

前もって感謝します、Matthijs

4

2 に答える 2

0

最初に重複を削除できます。

In [11]: df = df.drop_duplicates()

In [12]: df
Out[12]:
  Name ID
0    A  1
1    B  2
2    C  3
4    E  4
5    F  4

id と 1 つのgroupby要素を持つもののみを考慮します。

In [13]: g = df.groupby('ID')

In [14]: size = (g.size() == 1)

In [15]: size
Out[15]:
ID
1      True
2      True
3      True
4     False
dtype: bool

In [16]: size[size].index
Out[16]: Int64Index([1, 2, 3], dtype=int64)

In [17]: df['ID'].isin(size[size].index)
Out[17]:
0     True
1     True
2     True
4    False
5    False
Name: ID, dtype: bool

そしてこれによるブールインデックス:

In [18]: df[df['ID'].isin(size[size].index)]
Out[18]:
  Name ID
0    A  1
1    B  2
2    C  3
于 2013-07-30T15:42:02.483 に答える