У меня есть два фрейма данных, которые импортируются из разных .csv
.
df10=pd.read_csv(path10, usecols=["Registros validados"])
df25=pd.read_csv(path25, usecols=["Registros validados"])
Это 173 тыс. Строк и один столбец, в данных содержатся числа, но есть пустые измерения, которые при чтении изcsv
обрабатываются как пустая строка (как и числа в этом отношении).
То, что мне нужно сделать, это просто, мне нужно вычитать их только тогда, когда в обоих столбцах есть число, и создать третий кадр данных.
Нашел две идеи, которые я получил из других постов этой веб-страницы. Следующие два - это те, которые работали (не дали мне ошибок), потому что в основном я видел .apply
, но это всегда было так, когда использовались столбцы с одного и того же кадра данных, которого здесь нет.
Варианты, которые «работали», были
list(map(subs_PM, dfpm10, dfpm25))
# Returns ['']
и
dfpm10.combine(dfpm25, func=subs_PM)
# Actually returns a data frame, but is always empty with ''.
Используемая функция вычитания была
def subs_PM_old(pm10, pm25):
try: # Thinking the strings would fail at this
pm10=int(pm10)
pm25=int(pm25)
except:
return ' '
else:
return pm10-pm25
Мысль может быть, расхожденияв вычитании было связано с тем, что датафрейм не состоял из цифр. Поэтому я сделал следующее, чтобы преобразовать числа в числа и оставить строки в виде строк.
df10=df10.apply(pd.to_numeric, errors='ignore')
df25=df25.apply(pd.to_numeric, errors='ignore')
и обновил функцию до
def subs_PM(pm10, pm25):
boolpm10=isinstance(pm10, (int, long, float, complex)) and not isinstance(pm10, bool)
boolpm25=isinstance(pm10, (int, long, float, complex)) and not isinstance(pm25, bool)
if boolpm10 and boolpm25:
return pm10-pm25
else:
return ''
Но ничего не изменилось
Похоже, происходит то, что в обоих случаях функция вычитания используется только для первой строки, а затем предполагается, что она будет такой же для остальных элементов.
Есть ли способ изменить это?
Очевидно, что это не мои кадры данных, но подумайте, чтобы поиграться с
df1 = pd.DataFrame({1: range(10)})
df2 = pd.DataFrame({1: [2, 3, '', '', 2, 1, '', 6, 2, 3]})
df1.combine(df2, func=subs_PM)
df1.combine(df2, func=subs_PM_old)
list(map(subs_PM, df1, df2))
list(map(subs_PM_old, df1, df2))