Pandas loc динамический условный список - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть Pandas DataFrame, и я хочу найти все строки, в которых значения i-го столбца в 10 раз больше, чем у других столбцов.Вот пример моего DataFrame:

Sample data

Например, если посмотреть на столбец i = 0, строка B (0,344) в 10 раз больше значенийв той же строке, но в других столбцах (0,001, 0, 0,009, 0).Поэтому я хотел бы:

my_list_0=[False,True,False,False,False,False,False,False,False,False,False]

Количество столбцов может измениться, поэтому я не хочу решения, такого как:

#This is good only for a DataFrame with 4 columns.
my_list_i = data.loc[(data.iloc[:,i]>10*data.iloc[:,(i+1)%num_cols]) &
                     (data.iloc[:,i]>10*data.iloc[:,(i+2)%num_cols]) &
                     (data.iloc[:,i]>10*data.iloc[:,(i+3)%num_cols])]

Есть идеи?спасибо.

1 Ответ

0 голосов
/ 14 февраля 2019

С учетом df:

df = pd.DataFrame({'cell1':[0.006209, 0.344955, 0.004521, 0, 0.018931, 0.439725, 0.013195, 0.009045, 0, 0.02614, 0],
              'cell2':[0.048043, 0.001077, 0,0.010393, 0.031546, 0.287264, 0.016732, 0.030291, 0.016236, 0.310639,0], 
              'cell3':[0,0,0.020238, 0, 0.03811, 0.579348, 0.005906, 0,0,0.068352, 0.030165],
              'cell4':[0.016139, 0.009359, 0,0,0.025449, 0.47779, 0, 0.01282, 0.005107, 0.004846, 0],
              'cell5': [0,0,0,0.012075, 0.031668, 0.520258, 0,0,0,2.728218, 0.013418]})
i = 0

Вы можете использовать

(10 * df.drop(df.columns[i], axis=1)).lt(df.iloc[:,i], axis=0).all(1)

, чтобы получить

0     False
1      True
2     False
3     False
4     False
5     False
6     False
7     False
8     False
9     False
10    False
dtype: bool

для любого количества столбцов.Это отбрасывает столбец i, умножает оставшееся значение df на 10 и проверяет по строкам, что оно меньше i, затем возвращает True, только если все значения в строке True.Таким образом, он возвращает вектор True для каждой строки, в которой он получен, и False для других.

Если вы хотите задать произвольный порог, вы можете сложить Trues и поделить на количество столбцов - 1, а затем сравнить с вашим порогом:

thresh = 0.5  # or whatever you want
(10 * df.drop(df.columns[i], axis=1)).lt(df.iloc[:,i], axis=0).sum(1) / (df.shape[1] - 1) > thresh

0     False
1      True
2      True
3     False
4     False
5     False
6     False
7     False
8     False
9     False
10    False
dtype: bool
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...