我有一个带有10000 rows
,6 columns
的sqlite数据库和一个名为Code
的唯一列。我还有一个pandas df
6 columns
,一个名为Code
的唯一列,但9000 rows
。
如何查看来自1000
的{{1}}哪些行不在 sql database
?
我试过了:
df
但这不起作用。它只是给我回报了一切
答案 0 :(得分:1)
这是一个小型演示:
让我们首先生成一个样本DF(10行,3列)并将其写入SQLiteDB文件:
In [40]: import sqlite3
...: from sqlalchemy import create_engine
...:
...: engine = create_engine('sqlite:///d:/temp/sqlalchemy_example.db')
...:
...: x = pd.DataFrame(np.random.randint(0, 10, (10,3)), columns=list("abc"))
...: x.insert(0, 'Code', np.arange(len(x)))
...: x.to_sql('my_table', engine, index=False)
...:
In [41]: x
Out[41]:
Code a b c
0 0 4 6 6
1 1 2 5 8
2 2 3 9 2
3 3 3 1 2
4 4 9 8 4
5 5 2 8 1
6 6 5 1 8
7 7 8 9 7
8 8 0 7 3
9 9 2 6 3
现在让我们生成包含5行3列的df
:
In [42]: df = pd.DataFrame(np.random.randint(0, 10, (5,3)), columns=list("abc"))
...: df.insert(0, 'Code', np.arange(len(df)))
...:
In [43]: df
Out[43]:
Code a b c
0 0 8 4 8
1 1 1 1 0
2 2 5 5 2
3 3 2 2 8
4 4 3 2 2
请注意,这两个数据集都有唯一 Code
列。
<强>解决方案:强>
In [44]: db_df = pd.read_sql('select * from my_table', engine)
...: missing = db_df.loc[~db_df.Code.isin(df.Code)]
...: print(missing)
...:
Code a b c
5 5 2 8 1
6 6 5 1 8
7 7 8 9 7
8 8 0 7 3
9 9 2 6 3
<强>更新强>
~
是布尔索引的否定:
In [45]: db_df.Code.isin(df.Code)
Out[45]:
0 True
1 True
2 True
3 True
4 True
5 False
6 False
7 False
8 False
9 False
Name: Code, dtype: bool
In [46]: ~db_df.Code.isin(df.Code)
Out[46]:
0 False
1 False
2 False
3 False
4 False
5 True
6 True
7 True
8 True
9 True
Name: Code, dtype: bool