Панды не считают строки должным образом

Вы не можете заменить lambda input -> getValueProvider().apply(input).getValue() ссылкой на метод без изменения семантики.

Ссылка на метод заменяет вызов метода single , поэтому он не может просто замените лямбда-выражение, состоящее из более чем одного вызова метода.

Лямбда-выражение формы input -> getValueProvider().apply(input) может быть заменено на getValueProvider()::apply, если и только если время оценки getValueProvider() не имеет значения, как в лямбдной форме, метод вызывается для каждой оценки лямбда-тела, а для ссылки на метод он вызывается только один раз и результат захватывается.

Это похоже на разницу между x -> System.out.println(x) и System.out::println, где чтение содержимого поля System.out происходит в разное время, но обычно это не имеет значения. Но вы должны знать разницу.

В вашем примере вызывается третий метод getValue(). Единственный способ выразить это с помощью ссылок на методы требует функционального интерфейса, такого как Function, который имеет такие методы, как andThen и / или compose. Тем не менее, как работает Java 8, для чего требуется, чтобы первая ссылка метода на целевой интерфейс вызывала метод комбинирования, который отнюдь не будет легче читать, что у вас есть лямбда-выражение: ((Function<X,Y>)getValueProvider()::apply).andThen(Y::getValue), где Y тип apply(input) возвращается.

Обратите внимание, что правило гласит: «Замените лямбда с помощью ссылок на методы , когда это возможно », что дает вам возможность сказать: «ну, здесь невозможно », Однако, я не уверен, как много вы можете назвать это« правилом »тогда ...

2
задан jpp 16 January 2019 в 15:01
поделиться

2 ответа

Также прост для цикла с in будет работать

sum(['HS+P+SD' in x for x in df['class']])

О времени (если вы хотите проверить эту ссылку )

df=pd.concat([df]*100)
%timeit df['class'].str.contains('HS+P+SD', regex=False).sum()
1000 loops, best of 3: 410 µs per loop
%timeit sum(['HS+P+SD' in x for x in df['class']])
10000 loops, best of 3: 123 µs per loop
0
ответ дан Wen-Ben 16 January 2019 в 15:01
поделиться

Попробуйте:

print(len(split_df[split_df["class"].str == 'HS+P+SD']))
0
ответ дан Filipe Aleixo 16 January 2019 в 15:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: