如何检查我的sqlite列是否不在我的数据框中?

时间:2017-02-09 15:12:40

标签: python sqlite pandas dataframe sqlalchemy

我有一个带有10000 rows6 columns的sqlite数据库和一个名为Code的唯一列。我还有一个pandas df 6 columns,一个名为Code的唯一列,但9000 rows

如何查看来自1000的{​​{1}}哪些行不在 sql database

我试过了:

df

但这不起作用。它只是给我回报了一切

1 个答案:

答案 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