#python #pandas #numpy
#python #pandas #numpy
Вопрос:
У меня есть фрейм данных с 15 столбцами с именами 0,1,2,…, 14. Я хотел бы написать метод, который принимал бы эти данные и вектор длиной 15. Я хотел бы, чтобы он возвращал фрейм данных, условно выбранный на основе этого переданного мной вектора. Например. переданные данные — data_, а переданный вектор — v_. Я хотел бы создать это:
data[(data[0] == v_[0]) amp; (data[1] == v_[1]) amp; ... amp; (data[14] == v_[14])]
Однако я хотел бы, чтобы метод был гибким, например, я мог бы передать фрейм данных из 100 столбцов с именами 0, …, 99 и вектор длиной 99. Моя проблема в том, что я не знаю, как умно создать [(data[0] == v_[0]) amp; (data[1] == v_[1]) amp; ... amp; (data[14] == v_[14])]
программно для учета знака «amp;». В равной степени я был бы удовлетворен, если бы кто-нибудь дал мне метод, который мог бы объединить несколько матриц NxM, заполненных True и False в «и» или «или» в единую матрицу MxN.
Большое вам спасибо!
Комментарии:
1. если v_ представляет собой массив того же размера, что и количество столбцов, вы можете попробовать
data[(data==v_).all(axis=1)]
Ответ №1:
Вы можете попробовать это:
def custom_filter(data, v):
if len(data.columns) == len(v):
# If data has the same number of columns
# as v has elements
mask = (data == v).all(axis=1)
else:
# If they have a different length, we'll need to subset
# the data first, then create our mask
# This attempts to susbet the dataframe by assuming columns
# 0 .. len(v) - 1 exist as columns, and will throw an error
# otherwise
colnames = list(range(len(v)))
mask = (data[colnames] == v).all(axis=1)
return data.loc[mask, :]
df = pd.DataFrame({
"F": list("hiadsfin"),
0: list("aaaabbbb"),
1: list("cccdddee"),
2: list("ffgghhij")
})
v = ["a", "c", "f"]
df
F 0 1 2 H
0 h a c f 1
1 i a c f 2
2 a a c g 3
3 d a d g 4
4 s b d h 5
5 f b d h 6
6 i b e i 7
7 n b e j 8
custom_filter(df, v)
F 0 1 2 H
0 h a c f 1
1 i a c f 2
Обратите внимание, что с помощью этой функции, если количество столбцов точно соответствует длине вашего вектора v
, вам не нужно проверять, помечены ли столбцы как 0, 1, 2, ..., len(v)-1
. Однако, если у вас больше столбцов, чем элементов v, вам необходимо убедиться, что подмножество этих столбцов, помеченных как 0, 1, 2, ..., len(v)-1. If
v`, длиннее, чем столбцы в вашем фрейме данных, это выдаст ошибку.
Ответ №2:
Это может сработать:
data[(data==v_.transpose())].dropna(axis=1)