проблема с выбором данных с помощью панд.iloc - PullRequest
0 голосов
/ 26 сентября 2018

Это примерный фрейм данных

ID,IS,Val1,Val2,Val3
1,100,11,9,1
2,101,3,15,16
3,99,10,18,3
1,97,29,25,26

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

df1 = df.set_index('ID').iloc[:,1:].idxmin(axis=1).reset_index(name= 'New')

df2 = df1.loc[34 > df.iloc[:, 1:].min(1)]

Я получил этот результат

ID   New
 1  Val3
 2  Val1
 3  Val3
 1  Val2

Я также получил тот же результат, когда яиспользуя этот код

df2 = df1.loc[34 > df.iloc[:, 3:].min(1)] # в этом коде, я начинаю свой столбец с Val2, но он все еще дает тот же результат (включая Val1)

ID   New
 1  Val3
 2  Val1
 3  Val3
 1  Val2

Почему я получаю тот же результатхотя я выбираю из третьего столбца?Что именно эта строка кода делает здесь?df1.loc [34> df.iloc [:, 1:]. min (1)]

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Ваш код для df2 выбирается только из столбцов, озаглавленных Val2 и Val3, но пока ваш код для df1 все еще включает Val1, вы все равно увидите Val1 в выходных данных.

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

group1 = df[["Val1", "Val2", "Val3"]] # find the min among these 3 cols
group2 = df[["Val2", "Val3"]]   # find the min among only these 2 cols
df["min1"] = group1.min(axis=1)
df["col1"] = group1.idxmin(axis=1)
df["min2"] = group2.min(axis=1)
df["col2"] = group2.idxmin(axis=1)

filtered1 = df.loc[12 > df.min1]  # Val3, Val1, Val3 contain the minimum values
filtered2 = df.loc[12 > df.min2]  # Val3, Val3 contain the minimum values
0 голосов
/ 26 сентября 2018

Оба ваших логических условия возвращают все истины для каждой строки, поэтому у вас одинаковый результат

34 > df.iloc[:, 3:].min(1)
Out[202]: 
0    True
1    True
2    True
3    True
dtype: bool
34 > df.iloc[:, 1:].min(1)
Out[203]: 
0    True
1    True
2    True
3    True
dtype: bool

iloc - это срезать фрейм данных по позиции

df.iloc[:, 1:]
Out[204]: 
    IS  Val1  Val2  Val3
0  100    11     9     1
1  101     3    15    16
2   99    10    18     3
3   97    29    25    26
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...