如果两者都满足条件,则按 ID 删除重复行

时间:2020-12-18 19:19:07

标签: python pandas

如果记录满足以下条件,即如果记录重复且“第二个”记录显示第一条记录的交易金额的负倒数,我想通过 ID 从数据库中删除记录。在下面的示例中,我想删除 ID 2 和 4。

这是我的示例数据库

ID  transaction 
1        203
2        506
2       -506
3        700
4        234
4       -234
5        120
5        230

期望输出

ID  transaction 
1       203
3       700
5       120
5       230

3 个答案:

答案 0 :(得分:2)

我相信您可以通过按 ID 求和并选择总和 > 0 的所有交易来实现这一点。

>>> df = pd.DataFrame.from_records([(1,203),(2,506),(2,-506),(3,700),(4,234),(4,-234)], columns=['ID', 'transaction'])
>>> transaction_totals = df.groupby('ID').transaction.sum()
>>> transaction_totals.loc[transaction_totals > 0].reset_index()
   ID  transaction
0   1          203
1   3          700

答案 1 :(得分:1)

您可以使用 drop_duplicated 删除具有相同 ID 的行。

In [58]: df = pd.DataFrame({'ID':[1,2,2,3,4,4], 
    ...: 'transaction':['$203','$506','$(506)','$700','$234','$(234)']})        

In [59]: df                                                                     
Out[59]: 
   ID transaction
0   1        $203
1   2        $506
2   2      $(506)
3   3        $700
4   4        $234
5   4      $(234)

In [60]: df.drop_duplicates(subset=['ID'],keep=False,inplace=True)              

In [61]: df                                                                     
Out[61]: 
   ID transaction
0   1        $203
3   3        $700

您可以阅读有关 drop_duplicate here 的更多信息。

更新 基于OP的数据更新,可以创建具有事务绝对值的列,并使用drop_dduplicate删除ID和新列中具有相同值的行。

In [68]: df['abs_transactions'] = df.transaction.abs()                          

In [69]: df                                                                     
Out[69]: 
   ID  transaction  abs_transactions
0   1          203               203
1   2          506               506
2   2         -506               506
3   3          700               700
4   4          234               234
5   4         -234               234
6   5          120               120
7   5          230               230

In [71]: df.drop_duplicates(subset=['ID','abs_transactions'],keep=False,inplace=
    ...: True)                                                                  

In [72]: df                                                                     
Out[72]: 
   ID  transaction  abs_transactions
0   1          203               203
3   3          700               700
6   5          120               120
7   5          230               230

In [74]: df.drop('abs_transactions',inplace=True,axis=1)                        

In [75]: df                                                                     
Out[75]: 
   ID  transaction
0   1          203
3   3          700
6   5          120
7   5          230

答案 2 :(得分:1)

如果您的数据框仅包含这些列,您可以简单地将数据框转换为 abs,然后在一行中转换为 drop_duplicates()

df_new = abs(df).drop_duplicates(keep=False)

打印:

print(df_new)

Out[23]: 
   ID  transaction
0   1          203
3   3          700
6   5          120
7   5          230