【发布时间】:2021-08-22 00:56:37
【问题描述】:
我知道此类问题已被多次问过,但这些解决方案都没有帮助我。所以我为我的特殊情况发布了另一个。
我从 SQL 获取数据,数据框看起来像:
#for getting data from server
df1 = dd.read_sql_table(sa_query, connect_str, index_col=ind_col, columns=sa_columns)
#df1
col1 col2 ... coln
1 ... 1
2 ... 3
2.3 ... 3
3 ... 4
并使用 csv 文件:
#for reading csv file
df2 = dd.read_csv(file, low_memory=False, dtype=str)
#df2
col1 col2 ... coln
1 ... 1
2 ... 2
2.3 ... 3
4 ... 4
我正在合并两个数据框并创建一个新的 df,如下所示:
#df
col1_df1 col1_df2 col2_df1 col2_df2 ... coln_df1 coln_df2
1 1 ... 1 1
2 2 ... 3 2
2.3 2.3 ... 3 3
3 4 ... 4 4
我检查过,df1 和 df2 中的所有列的类型均为 object 或 string。某些列中可能包含 null 或没有值。我想要实现的是比较 col1_df1 和 col2_df2 中的值,并使用比较的 True/False 值创建一个新列 col1_match。
更新
我正在努力做到这一点:
if df[col1_df1].dtype.kind == df[col1_df2].dtype.kind:
if df[col1_df1].dtype.kind == 'O':
df[col1_match] = df[col1_df1].astype(str).fillna('') == df[col1_df2].astype(str).fillna('')
elif df[col1_df1].dtype.kind == 'f':
df[col1_match] = ((df[col1_df1] - df[col1_df2]).abs() <= 0)
elif df[col1_df1].dtype.kind == 'i':
df[col1_match] = ((df[col1_df1] - df[col1_df2]).abs() <= 0)
else:
df[col1_match] = df[col1_df1] == df[col1_df2]
else:
print("does not match")
df[col1_match] = df[col1_df1] == df[col1_df2]
这会产生
col1_df1 col1_df2 col2_df1 col2_df2 ... coln_df1 coln_df2 col1_match col2_match ... coln_match
1 1 ... 1 1 True False True
2 2 ... 3 2 True False False
2.3 2.3 ... 3 3 True False True
3 4 ... 4 4 False False True
它仍然为空值返回False。
【问题讨论】:
-
字符串的“非常接近”是什么意思?您想解释为浮点数并进行比较吗?
-
.02 差异并不重要。我的情况也是如此。但我无法将字符串列转换为浮点数。我尝试使用
.astype(float),但它给了我错误
标签: python pandas pycharm dask dask-dataframe