#python #pandas #dataframe
Вопрос:
У меня есть рамка данных о размерах зерен, собранных в поле. Но не все поддается измерению, иногда я сталкиваюсь с такими вещами, как обломки (D) или коренные породы (B):
Я пытаюсь вычислить процент каждого неизмеримого, преобразовать песок (Ы) в число (0,5) и поместить некоторые из больших чисел в отдельные категории (220 -gt; 256).
Все, что я нашел для работы со значениями str, прерывается, когда он сталкивается с int, и все, что я нашел для работы со значениями int, прерывается, когда он сталкивается с str.
Мне бы не помешала небольшая помощь здесь.
Рабочий код:
#import the dataset to be read, full file path dict=pd.read_excel('/media/path', sheet_name=None) #iterate through all of the sheets of the input data, will be stored as pandas dataframes nested in a dictionary for df in dict.values(): #count of bedrock, is also % since there are 100 values B=0 #count of debris D=0 #specify numbers for sand and silt. Chosen from near the middle of Wentworth size classes. s={'S':0.5} l={'L':0.01,'C':0.01} for col in df: for item in df[col]: if (type(item)==str): if 'B' in item: B =1 if 'D' in item: D =1 #turn sand and silt into numbers to keep in grain size analysis df=df.replace(s) df=df.replace(l) #turn all of the strings to nan for calculations df[col]=pd.to_numeric(df[col],errors='coerce') #discretize larger pebbles df[col]=pd.cut(df[col], bins=size_class,labels=label,right=True)
Комментарии:
1. Привет, не могли бы вы показать часть своего кода или, по крайней мере, как должен выглядеть ожидаемый результат?
2. Вот как я хочу, чтобы таблица выглядела после вычисления числа вхождений каждой строки nan,2.8,45,128,45,90,180,128,нан,нан; нан,нан,180,45,90,45,128,45,11,нан; 64,128,90,45,2.8,45,64,45,128,5.6; нан,45,64,64,64,32,45,128,90,нан; 32,180,45,16,22.6,180,32,90,64,180; 90,32,11,32,нан,45,11,45,128,2; 2.8,360,180,180,нан,22.6,5.6,128,16,128; 16,45,2.8,22.6,16,128,90,180,5.6,нан; 16,64,32,8,90,128,90,128,нан,нан; нан,16,180,16,1024,360,256,128,32,90;
3. добавьте соответствующий фрагмент кода и вышеуказанные данные в свой вопрос, отредактировав свой вопрос.
Ответ №1:
Насколько я понимаю, вам нужно знать тип каждого элемента в таблице, чтобы выполнять свои вычисления и операции с ним. Это возможно с помощью функции type()
(и .isdigit()
метода для числовых строк).
import pandas as pd data = [ [2,8.5,125,12,'D'], [145,82,63.1,'B',41.9], [75,54,'D',253,21], ] df = pd.DataFrame(data) for column in df: for item in df[column]: #check item is a string if (type(item) == str): print(item, "is a string") # check item is number (int,float,number in string) elif (type(item) == float) or (type(item) == int) or (str(item).isdigit()): print(item, "is a number")
Комментарии:
1. Спасибо, это сработало чудесно. Теперь я застрял, пытаясь классифицировать большие значения. Я пытаюсь это сделать: elif (тип(товар)==плавающий) или (тип(товар)==int): если товар gt; 8192: товар=11520 elif 8192 gt;gt;= товар gt;gt;gt; 5760: товар=8192 elif 5760 gt;gt;gt;gt;= товар gt; gt; gt; gt; 4096: товар=5760, но это не работает. Есть еще какие-нибудь рекомендации?
2. В настоящее время я пытаюсь: df[col]=pd.cut(df[col], bins=[0,0.01,0.5,2,2.8,4,5.6,8,11,16,22.6,32,45,64,90,128,190,256,360,512,720,1024,1440,2048,2880,4096,5760,8192,11520,np.inf],labels=False,right=True) 1 и он красиво классифицирует значения, просто не в тех категориях, в которых я хочу их видеть.
3. Мне удалось заставить его работать. Спасибо вам за вашу помощь.