Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 清除dataframe列,从某些其他dataframe中显示的字符串中删除部分_Python_Arrays_Pandas_String_List - Fatal编程技术网

Python 清除dataframe列,从某些其他dataframe中显示的字符串中删除部分

Python 清除dataframe列,从某些其他dataframe中显示的字符串中删除部分,python,arrays,pandas,string,list,Python,Arrays,Pandas,String,List,我试图通过另一个数据帧的列中的值来清理一个数据帧中的数据。第一个数据帧包含分号分隔的值列表,第二个数据帧包含单个单词。 清理后,第一个数据帧不得包含第二个数据帧中的任何字 data df1 data df2 x1;x2;x3 x1 key2;key6;key7;key8 x2

我试图通过另一个数据帧的列中的值来清理一个数据帧中的数据。第一个数据帧包含分号分隔的值列表,第二个数据帧包含单个单词。 清理后,第一个数据帧不得包含第二个数据帧中的任何字

data df1                                       data df2

x1;x2;x3                                       x1
key2;key6;key7;key8                            x2
                                               key6  
                                               key8
我需要从数据
df1
中删除数据
df2
中存在的值。我试图将不同dfs中的两列转换为两个列表,并从
df1
list1
中删除
df2的
list2
中的值


考虑到data
df2
列可能有超过1M行,而data
df1
列中的一行上有多个值,有没有一种没有循环的更快方法来实现这一点?

基本上可以通过将数据帧的列拆分为足够多的列并替换值来实现:

import pandas as pd

df1 = pd.DataFrame({"a": ["x1;x2;x3", "key2;key6;key7;key8"]})
df2 = pd.DataFrame({"tbd": "x1,x2,key6,key8".split(",")})

print(df1)
print(df2)
# create a new df that contains splitted values as columns
df3 = df1["a"].str.split(";", expand=True).fillna(value="")
print(df3)

# replace non wanted values
df3.replace( df2["tbd"],"", inplace=True)
df3.replace( df3, None, "", inplace=True)
print(df3)
输出:

# df1
    a
0             x1;x2;x3
1  key2;key6;key7;key8

# df2
    tbd
0    x1
1    x2
2  key6
3  key8

# df3 (df1 column "a" after splitting into new df)
      0     1     2     3
0    x1    x2    x3  
1  key2  key6  key7  key8

# replacing all values from df3 that are in df2["tbd"]
      0     1     2     3
0                x3  
1  key2  key6  key7
您可能需要再次收集数据


要一次性清理
df1
,您可以使用如下列表:

import pandas as pd

df1 = pd.DataFrame({"a": ["x1;x2;x3", "key2;key6;key7;key8"]})
df2 = pd.DataFrame({"tbd": "x1,x2,key6,key8".split(",")})


df1["a"] = [';'.join([i for i in v.split(";")             # split and recombine again
                      if i not in frozenset(df2["tbd"])]) # remove i from v if in df2
            for v in df1["a"]]                            # v == any rows of column

print(df1)


          a
0         x3
1  key2;key7

此解决方案可以是和的答案的组合,但它不是这两个答案的纯副本。

谢谢。最后一步是将结果值连接到df3中,并将其粘贴到初始df1中,对吗?是的,基本上在df1中,我必须保留DF2中不存在的df1中的值。由于第二个文件包含超过100万行的数据,有没有办法加快处理过程?非常感谢