我有两个从不同的.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))
答案 0 :(得分: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 :(得分:1)
要检查所有变体,我按如下所示定义了源DataFrame:
df1 = pd.DataFrame({1: [0, '', 2, 3, 4, 5, '', 7, 8, 9]})
df2 = pd.DataFrame({1: [2, 3, '', '', 2, 1, 5, 6, 2, 3]})
目标是拥有“成对”的参数,其中 df1 或 df2 可以包含一个字符串(将从最终结果中排除)。
初始操作涉及:
执行此操作的代码是:
res = df1.join(df2, rsuffix='_2').replace('', np.nan).dropna().astype(int)
res.columns=['c1', 'c2']
对于我的源数据,结果是:
c1 c2
0 0 2
4 4 2
5 5 1
7 7 6
8 8 2
9 9 3
然后只需计算差异,然后将其保存在另一列中即可
res['dif'] = res.c1 - res.c2
最终结果是:
c1 c2 dif
0 0 2 -2
4 4 2 2
5 5 1 4
7 7 6 1
8 8 2 6
9 9 3 6
如果需要,请删除 c1 和 c2 列。