#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. Я немного отредактировал его, так ли это нормально?