Java: массив примитивных типов данных не блокируется автоматически

Чтобы выбрать строки, значение столбца которых равно скаляру, some_value, используйте ==:

df.loc[df['column_name'] == some_value]

Чтобы выбрать строки, значение столбца которых в итерабельном, some_values, используйте isin:

df.loc[df['column_name'].isin(some_values)]

Объединить несколько условий с &:

df.loc[(df['column_name'] == some_value) & df['other_column'].isin(some_values)]

Выбрать строки, значение столбца не равно some_value, используйте !=:

df.loc[df['column_name'] != some_value]

isin возвращает булевскую серию, поэтому для выбора строк, значение которых не в some_values, отмените булевскую серию используя ~:

df.loc[~df['column_name'].isin(some_values)]

Например,

import pandas as pd
import numpy as np
df = pd.DataFrame({'A': 'foo bar foo bar foo bar foo foo'.split(),
                   'B': 'one one two three two two one three'.split(),
                   'C': np.arange(8), 'D': np.arange(8) * 2})
print(df)
#      A      B  C   D
# 0  foo    one  0   0
# 1  bar    one  1   2
# 2  foo    two  2   4
# 3  bar  three  3   6
# 4  foo    two  4   8
# 5  bar    two  5  10
# 6  foo    one  6  12
# 7  foo  three  7  14

print(df.loc[df['A'] == 'foo'])

дает

     A      B  C   D
0  foo    one  0   0
2  foo    two  2   4
4  foo    two  4   8
6  foo    one  6  12
7  foo  three  7  14

Если у вас несколько значений вы хотите включить, поместить их в список (или, в более общем плане, любой итерабельный) и использовать isin:

print(df.loc[df['B'].isin(['one','three'])])

дает

     A      B  C   D
0  foo    one  0   0
1  bar    one  1   2
3  bar  three  3   6
6  foo    one  6  12
7  foo  three  7  14

Примечание, однако, если вы хотите сделать это много раз, более эффективно сначала сделать индекс, а затем использовать df.loc:

df = df.set_index(['B'])
print(df.loc['one'])

дает

       A  C   D
B              
one  foo  0   0
one  bar  1   2
one  foo  6  12

или, чтобы включить несколько значений из использования индекса df.index.isin:

df.loc[df.index.isin(['one','two'])]

дает

       A  C   D
B              
one  foo  0   0
one  bar  1   2
two  foo  2   4
two  foo  4   8
two  bar  5  10
one  foo  6  12
29
задан newacct 3 July 2014 в 23:47
поделиться

8 ответов

Нет никакой автоупаковки для массивов, только для примитивов. Я полагаю, что это - Ваша проблема.

41
ответ дан Eddie 4 July 2014 в 10:47
поделиться
  • 1
    Прямо сейчас я вижу, что мой JAVA_HOME пуст. Это означает, что установка JAVA_HOME не обязательна и просто включает в предпочтительной утилите Java, достаточно для указания на требуемую версию на CurrentJDK? – reddyvaribabu 27 May 2011 в 02:57

Более простой способ сделать это

char ch = 'a';
String chars = "abc";
boolean member = chars.indexOf(ch) >= 0;
0
ответ дан Peter Lawrey 4 July 2014 в 10:47
поделиться
  • 1
    I' m в той же обуви. У меня есть iPad, но никакие другие устройства Apple. Таким образом, я должен купить рабочий стол Apple или спуститься с маршрута hackintosh. – Csaba Toth 25 March 2016 в 05:53

Почему char[] был бы упакован к Character[]? Массивы всегда ссылочные типы, таким образом, никакая упаковка не требуется.

, Кроме того, это было бы ужасно дорого - это включит создание нового массива и затем упаковку каждого символа в свою очередь.Черт!

14
ответ дан Jon Skeet 4 July 2014 в 10:47
поделиться
  • 1
    да, JAVA_HOME не обязателен, но если бы Вы устанавливаете jdk-1.5, Вы все еще хотите иметь jdk-1.6 быть используемым системой, таким образом установка JAVA_HOME позволила бы Вам использовать любой jdk, в то время как система использует официальный jdk-1.6 – Karl-Bjørnar Øie 27 May 2011 в 02:58

Массивы являются типом реализации низкого уровня вещи. char[] будет непрерывная область памяти с двухбайтовыми символами. Character[] будет непрерывная область памяти с четы-или восьмибайтовыми ссылками. Вы не можете заставить Character[] переносить символ []. Однако List<Character> мог перенестись char[].

Массивы ссылок обычно не являются хорошей идеей, если Вы не пишете код низкого уровня. Вы, при необходимости могли бы записать или получить эквивалент java.util.Arrays.asList.

1
ответ дан Tom Hawtin - tackline 4 July 2014 в 10:47
поделиться
  • 1
    I' m обычно немного фанат Apple, но это является довольно раздражающим. – aaaidan 8 November 2012 в 16:42

Это, кажется, дизайном, и избегает такой дорогой операции автоупаковки, и потому что дженерики должны быть назад совместимы с существующим байт-кодом Java.

См. эта статья и эта ошибка , например.

1
ответ дан Josh Lee 4 July 2014 в 10:47
поделиться
  • 1
    @raja777m ~ Никакая потребность включать продвижение ' $ ' в Вашей казни команды на терминале. Пропустите это, и все должны работать. – Tommie C. 26 March 2016 в 23:17

Корректный, нет никакой автоупаковки для массивов (который приводит к странности в случаях как int[] ints; ...; Arrays.asList(ints) - asList, возвращает Список, содержащий отдельный объект, массив!)

Вот простая утилита для упаковки массива.

public static Integer[] boxedArray(int[] array) {
    Integer[] result = new Integer[array.length];
    for (int i = 0; i < array.length; i++)
        result[i] = array[i];
    return result;
}

Вам будет нужна другая версия для каждого типа примитива, конечно.

2
ответ дан 4 July 2014 в 10:47
поделиться
  • 1
    Rajas-MacBook-Pro:/$ $ варят обновление - удар: $: команда, не найденная Rajas-MacBook-Pro:/варево $ $, устанавливает jenv - удар: $: команда, не найденная Rajas-MacBook-Pro:/$ $, повторяет ' экспортируйте СОЕДИНЯЮТ =" каналом; $HOME/.jenv/bin: $PATH" ' > > ~/.bash_profile - удар: $: команда, не найденная Rajas-MacBook-Pro:/$ $, повторяет ' оценка " $ (jenv init-) " ' > > ~/.bash_profile - удар: $: команда, не найденная Rajas-MacBook-Pro:/$$jenv, добавляет/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home - удар: добавьте: команда, не найденная – raja777m 24 November 2015 в 13:50

Вы можете использовать отражение, чтобы получить метод, который работает для всех типов массивов, но вы потеряете безопасность типов, так что это, вероятно, не то, что вы хотите.

import java.lang.reflect.Array
public static boolean isMemberOfArray(Object item, Object array)
{
    int n = Array.getLength(array)
    for (int i = 0; i < n; i++) {
        if (Array.get(array, i).equals(item)) {
            return true;
        }
    }
    return false;
}
3
ответ дан 28 November 2019 в 01:15
поделиться

Как уже упоминалось, автобоксы для массивов примитивов отсутствуют. Если вы хотите использовать свой метод с примитивными массивами, вам нужно будет предоставить перегрузку для каждого примитивного типа. Кажется, это стандартный способ работы с библиотеками классов. См., Например, перегрузки в java.util.Arrays .

1
ответ дан 28 November 2019 в 01:15
поделиться
Другие вопросы по тегам:

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