Чтобы выбрать строки, значение столбца которых равно скаляру, 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
Нет никакой автоупаковки для массивов, только для примитивов. Я полагаю, что это - Ваша проблема.
Более простой способ сделать это
char ch = 'a';
String chars = "abc";
boolean member = chars.indexOf(ch) >= 0;
Почему char[]
был бы упакован к Character[]
? Массивы всегда ссылочные типы, таким образом, никакая упаковка не требуется.
, Кроме того, это было бы ужасно дорого - это включит создание нового массива и затем упаковку каждого символа в свою очередь.Черт!
Массивы являются типом реализации низкого уровня вещи. char[]
будет непрерывная область памяти с двухбайтовыми символами. Character[]
будет непрерывная область памяти с четы-или восьмибайтовыми ссылками. Вы не можете заставить Character[]
переносить символ []. Однако List<Character>
мог перенестись char[]
.
Массивы ссылок обычно не являются хорошей идеей, если Вы не пишете код низкого уровня. Вы, при необходимости могли бы записать или получить эквивалент java.util.Arrays.asList
.
Это, кажется, дизайном, и избегает такой дорогой операции автоупаковки, и потому что дженерики должны быть назад совместимы с существующим байт-кодом Java.
См. эта статья и эта ошибка , например.
Корректный, нет никакой автоупаковки для массивов (который приводит к странности в случаях как 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;
}
Вам будет нужна другая версия для каждого типа примитива, конечно.
Вы можете использовать отражение, чтобы получить метод, который работает для всех типов массивов, но вы потеряете безопасность типов, так что это, вероятно, не то, что вы хотите.
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;
}
Как уже упоминалось, автобоксы для массивов примитивов отсутствуют. Если вы хотите использовать свой метод с примитивными массивами, вам нужно будет предоставить перегрузку для каждого примитивного типа. Кажется, это стандартный способ работы с библиотеками классов. См., Например, перегрузки в java.util.Arrays .