python - Pandas - 从具有混合数据类型的不同数据帧中减去列
问题描述
我有两个从不同的.csv
.
df10=pd.read_csv(path10, usecols=["Registros validados"])
df25=pd.read_csv(path25, usecols=["Registros validados"])
它们是 173k 行和一列,其中包含的数据是数字,但是有一些空测量值,当从它们读取时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))
解决方案
试试这个:
def subs_PM(pm10, pm25):
#pm10 and pm25 are series... not a single number
#print(pm10)
try:
pm10=pd.to_numeric(pm10)
pm25=pd.to_numeric(pm25)
return pm10-pm25
except:
return None
df1 = pd.DataFrame({1: range(10)})
df2 = pd.DataFrame({1: [2, 3, '', '', 2, 1, '', 6, 2, 3]})
df1.combine(df2, func=subs_PM)
推荐阅读
- r - 创建一个循环函数结果的数据框
- json - TypeError: JSON.stringify(...).then 不是函数
- mysql - 用 union 改变结果的mysql顺序
- list - 具有小二进制占用空间(千字节)的虚拟机/编程语言
- javascript - Videojs 有时不会发生并在我的 Reactjs 项目中出错
- reactjs - xs={false} 或 xs={0} 在 MUI React 中不起作用
- javascript - 如何在 onClick 事件处理程序上呈现组件
- c# - ASP.Net Core Identity ResetPasswordAsync 失败:InvalidToken
- oracle - 如何解析 BLOB 数据类型?
- jwt - 将有效或无效的 json Web 令牌存储在数据库中