繁体   English   中英

由于字符串值,数据框无法屏蔽行

[英]Dataframe failed to mask rows due to string values

我想在一个 csv 文件中使用列值来屏蔽另一个 csv 中的行,如下所示:

df6 = pd.read_csv(‘py_all1a.csv’) # file with multiple columns
df7 = pd.read_csv(‘artexclude1.csv’) # file with multiple columns
#    
#  csv df6 col 1 has the same header and data type as col 8 in df7.   
#  I want to mask rows in df6 that have a matching col value to any
#  in df7. The data in each column is a text value (single word).
#   
mask = df6.iloc[:,1].isin(df7.iloc[:,8]) 

df6[~mask].to_csv(‘py_all1b.csv’, index=False) 
#    

在最后一行,我尝试了 [mask] 与波浪号,导致 df6 文件 (py_all1b.csv) 没有更改,并且没有波浪号(生成仅包含列标题的文件)。

下面的答案提供了使用特定数据集的答案,但它不起作用,因为文本值之间存在不一致,即输入时有空格而另一个没有。

下面的答案是正确的,我添加了一个段落来说明文本问题也可以如何解决。

首先尝试转换为集合:

mask = df6.iloc[:,1].isin(set(df7.iloc[:,8]))

这确保您的比较是针对值的。

例子

df1 = pd.DataFrame([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]])
#     0   1   2
# 0   1   2   3
# 1   4   5   6
# 2   7   8   9
# 3  10  11  12

df2 = pd.DataFrame([[1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3]])
#    0  1  2
# 0  1  2  3
# 1  1  2  3
# 2  1  2  3
# 3  1  2  3

mask = df1.iloc[:,0].isin(set(df2.iloc[:,0]))

df1[mask]
#    0  1  2
# 0  1  2  3

带弦

它仍然有效:

df1 = pd.DataFrame([['a', 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]])
df2 = pd.DataFrame([['a', 2, 3], ['a', 2, 3], ['a', 2, 3], ['a', 2, 3]])

mask = df1.iloc[:,0].isin(set(df2.iloc[:,0]))

df1[mask]

#    0  1  2
# 0  a  2  3

在处理字符串数据时,可能会出现空格问题,导致匹配丢失。 this answer中所述,您可能需要改为使用:

df6 = pd.read_csv('py_all1a.csv', skipinitialspace=True) # file with multiple columns
df7 = pd.read_csv('artexclude1.csv', skipinitialspace=True) # file with multiple columns
mask = df6.iloc[:,1].isin(set(df7.iloc[:,8]))
df6[~mask].to_csv('py_all1b.csv', index=False)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM