печатное слово в столбце b, если значение в столбце a выше 1

#python #pandas

Вопрос:

Итак, у меня есть этот код, и он должен проверить, не превышает ли значение в столбце: friction_number 1, чем он должен печатать «гравий» для всех ячеек, в которых это имеет место. Я пытался работать с функциями, но тогда порядок не мог быть таким, каким он должен быть. мой код:

 import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from pygef.gef import ParseGEF

#Read *.gef file
gef = ParseGEF("./CPT000000052185_IMBRO_A.Gef")
gef.df.to_csv("./CPT000000052185_IMBRO_A.GEF")
file = pd.read_csv("./CPT000000052185_IMBRO_A.GEF", usecols=['friction_number' , 'depth'])

print (file)
file["Soil type"] = Soil_type

for i in file.friction_number:
    if (i > 1):
        Soil_type = "Gravel"
else:
    Soil_type = "unknown"
print (file)
 

Это печатает:

глубина трения_номер Тип почвы

0 1.60 1.498638 неизвестно

1 1,62 0,943396 неизвестно

2 1,64 0,909091 неизвестно

3 1.66 1.172708 неизвестно

4 1.68 1.585014 неизвестно

.. … … …

329 8.18 0.693328 неизвестно

330 8.20 0,665844 неизвестно

331 8.22 0.646598 неизвестно

332 8.24 0.626465 неизвестно

333 8.26 0.605465 неизвестно

что странно, потому что есть две ячейки, в которых значение выше 1, как я могу это решить?

ПРАВКА: Итак, я должен добавить несколько типов почв. Как я могу добавить несколько разных типов (например, песок).

Ответ №1:

Попробуйте с np.where :

 import numpy as np
import pandas as pd

df = pd.DataFrame({
    'depth': {0: 1.6, 1: 1.62, 2: 1.64, 3: 1.66, 4: 1.68},
    'friction_number': {0: 1.498638, 1: 0.943396, 2: 0.909091, 3: 1.172708,
                        4: 1.585014}
})

df['Soil Type'] = np.where(df['friction_number'].gt(1), 'Gravel', 'unknown')

print(df)
 

df :

    depth  friction_number Soil Type
0   1.60         1.498638    Gravel
1   1.62         0.943396   unknown
2   1.64         0.909091   unknown
3   1.66         1.172708    Gravel
4   1.68         1.585014    Gravel
 

Изменить: Для нескольких типов с несколькими условиями используйте np.select

 import numpy as np
import pandas as pd

df = pd.DataFrame({
    'depth': {0: 1.6, 1: 1.62, 2: 1.64, 3: 1.66, 4: 1.68},
    'friction_number': {0: 1.498638, 1: 0.943396, 2: 0.909091, 3: 1.172708,
                        4: 1.585014}
})

conds = [
    df['friction_number'].between(1, 1.5),
    df['friction_number'].gt(1.5)
]

labels = ['Gravel', 'Sand']

df['Soil Type'] = np.select(conds, labels, default='unknown')

print(df)
 

df :

    depth  friction_number Soil Type
0   1.60         1.498638    Gravel
1   1.62         0.943396   unknown
2   1.64         0.909091   unknown
3   1.66         1.172708    Gravel
4   1.68         1.585014      Sand
 

Комментарии:

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

2. df['friction_number'].between(1, 1.5)

3. ладно, это тоже сработало, большое тебе спасибо. И последний вопрос, допустим, есть второй тип «песок», который следует печатать, если число трения > 1,5. каков наилучший способ реализации этого?

4. Ответ на этот вопрос принципиально отличается от того, который вы задавали выше. Если я изменю свой ответ, он больше не будет правильным ответом на заданный вами вопрос. Не могли бы вы обновить свой вопрос, чтобы включить подробную информацию о том, как вы хотели бы классифицировать данные, чтобы вопрос и ответ по-прежнему совпадали?

5. Я немного отредактировал его, так ли это нормально?