Управляйте некоторыми полевыми данными, хранящимися во фрейме данных

#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. Мне удалось заставить его работать. Спасибо вам за вашу помощь.