Pandas-从具有混合数据类型的不同数据框中减去列

问题描述 投票:0回答:2

我有两个从不同的.csv导入的数据帧。

df10=pd.read_csv(path10, usecols=["Registros validados"])
df25=pd.read_csv(path25, usecols=["Registros validados"])

它们是17.3万行和一列,其中包含的数据是数字,但是有一些空的测量结果,当从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))

我有两个从不同的.csv导入的数据框。 df10 = pd.read_csv(path10,usecols = [“ Registros validados”])df25 = pd.read_csv(path25,usecols = [“ Registros validados”])它们是173k行...

python pandas dataframe
2个回答
1
投票
尝试这个:

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)


1
投票
为了检查所有变体,我如下定义了源DataFrame:
© www.soinside.com 2019 - 2024. All rights reserved.