numpy unique не удалось отфильтровать группы с одинаковым значением в определенном столбце - PullRequest
0 голосов
/ 11 мая 2018

Я попытался groupby a df и затем выбрать группы, которые не имеют одинаковое значение в определенном столбце и размер группы которых> 1,

df.groupby(['account_no', 'ext_id', 'amount']).filter(lambda x: (len(x) > 1) & (np.unique(x.int_id).size != 1))

df выглядитОбратите внимание, что некоторые строки account_no имеют только один пробел, ext_id и int_id также являются строками, amount - это float;

account_no    ext_id    amount        int_id
              2665057   439.504062     D000192
              2665057   439.504062     D000192
              353724    2758.92        952
              353724    2758.92        952

код, который должен возвращать пустой df, так как ни одна из строк в образце не удовлетворяет условиям здесь, но строки с int_id = 292 остались, так что как решить проблему здесь.

ps.numpy 1.14.3, pandas 0.22.0, python 3.5.2

1 Ответ

0 голосов
/ 12 мая 2018

По моему мнению, существует проблема с некоторыми пробельными символами или подобными.

Вы можете проверить это:

df = pd.DataFrame({'account_no': ['a', 'a', 'a', 'a'], 
                   'ext_id': [2665057, 2665057, 353724, 353724], 
                   'amount': [439.50406200000003, 439.50406200000003, 2758.92, 2758.92], 
                   'int_id': ['D000192', 'D000192', ' 952', '952']})
print (df)
  account_no       amount   ext_id   int_id
0          a   439.504062  2665057  D000192
1          a   439.504062  2665057  D000192
2          a  2758.920000   353724      952
3          a  2758.920000   353724      952

df1 = df.groupby(['account_no', 'ext_id', 'amount']).filter(lambda x: (len(x) > 1) & (np.unique(x.int_id).size != 1))
print (df1)
  account_no   amount  ext_id int_id
2          a  2758.92  353724    952
3          a  2758.92  353724    952

print (df1['int_id'].tolist())
[' 952', '952']

А затем удалить его с помощью str.strip:

df['int_id'] = df['int_id'].str.strip()
df1 = df.groupby(['account_no', 'ext_id', 'amount']).filter(lambda x: (len(x) > 1) & (np.unique(x.int_id).size != 1))
print (df1)
Empty DataFrame
Columns: [account_no, amount, ext_id, int_id]
Index: []
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...