熊猫合并和过滤器

时间:2019-05-18 18:33:20

标签: python pandas

我使用合并在两个查询之间创建一个数据框。 现在在数据框中,我想在列上放置一个过滤器,但无法使其正常工作。我正在尝试添加过滤器组件日期为null或空白。

    ##reading data from sql
    package = pd.read_sql(sql,con)
    component = pd.read_sql(sqla,con)

    ##doing the left join
    test2 = pd.merge(package,component, on = ['identifier','date'], how='left')

    ##shrinking the dataframe   
    test3 = test2[['identifier_x']].copy()

我尝试执行以下操作,但无法正常工作。未定义date_y。我也尝试仅使用date,因为当合并数据框时,类似的列会分别标记为xy

 test2 = pd.merge(package,component, on = ['identifier','date'], how='left'), component.query(date_y == '')

现在尝试:

test2 = pd.merge(package,component, on = ['identifier','date'], how='left')
test2.query('date_y == \'\'')

test2 = pd.merge(package,component, on = ['identifier','date'], how='left')
test2[test2.date_y == '']

也尝试过:

test2 = pd.merge(package,component, on = ['identifier','date'], how='left')
test2 = test2.date_y == ''

样本数据:

+------------+------------+------------+------------+
|   date_x   | identifier |   date_y   | identifier |
+------------+------------+------------+------------+
| 13/03/2019 | 3582191409 | 13/03/2019 | 3582191410 |
| 13/03/2019 | 3582191289 | 13/03/2019 | 3582191290 |
| 13/03/2019 | 3582190137 | 13/03/2019 | 3582190138 |
| 13/03/2019 | 3582185931 | 13/03/2019 | 3582185930 |
| 13/03/2019 | 3582184503 |            | 3582184502 |
| 13/03/2019 | 3582195631 |            | 3582195632 |
| 13/03/2019 | 3582191374 |            | 3582191373 |
| 13/03/2019 | 3582185917 |            | 3582185916 |
| 13/03/2019 | 3582185863 |            | 3582185862 |
+------------+------------+------------+------------+

我正在尝试过滤日期y =空白

2 个答案:

答案 0 :(得分:3)

您最有可能阅读空白。我首先要确保date_x和date_y是时间戳,并用np.nan替换所有空格:

test2['date_y']=test2['date_y'].replace(' ',np.nan)
test2['date_x']=pd.to_datetime(test2['date_x'])
test2['date_y']=pd.to_datetime(test2['date_y'])
test2_filtered=test2.loc[test2['date_y'].isnull()]

答案 1 :(得分:2)

您正在尝试过滤字符串,但这不是字符串-它是一个空的datetime.date对象。您需要按非空日期对象进行过滤。

您可以创建第二个数据框作为字符串类型,然后检查:

str_test2 = test2.astype(str)
filtered_test2 = test2[str_test2['date_y'] != '']

查看更多可能的解决方案here