如果记录满足以下条件,即如果记录重复且“第二个”记录显示第一条记录的交易金额的负倒数,我想通过 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
答案 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