【问题标题】:I want to swap row condition wise我想明智地交换行条件
【发布时间】:2020-04-17 12:07:46
【问题描述】:

我们有 4 列贷方、借方、旁白和余额。贷方列中的金额将记入余额列 借方栏的金额将从余额栏中扣除。我给一个数据农场供参考

   Narration  Credit  Debit  Balance
1  Abc         15.0    Nan    15.0
2  Qwe         NaN     5.0    10.0 
3  Wer         NaN     2.0     7.0  
4  opr         Nan     3.0     5.0
5  Yur         6.0     NaN    11.0

我有这样的数据农场,但是在这个 3 和 4 索引借方金额与余额值不匹配,所以我想要可以与余额匹配的数据农场..

  Narration  Credit  Debit  Balance
1  Abc         15.0    Nan    15.0
2  Qwe         NaN     5.0    10.0 
3  opr         NaN     3.0     7.0  
4  wer         Nan     2.0     5.0
5  Yur         6.0     NaN    11.0

我想要可以与贷记借记值匹配的数据农场。它只有 5 行,例如我有 500 行,所以我可以检查余额是否与贷记借记金额匹配。

【问题讨论】:

  • “匹配”是什么意思?
  • 如果贷方金额,则余额为正,借方,则余额为负数
  • 我认为他的意思是第 2 行的余额是 10,第 3 行有 2 借方,余额是 7,什么时候应该是 8,或者借方应该是 3(第 4 行) .
  • 请分享预期的输出
  • 借方金额

标签: python pandas dataframe analysis


【解决方案1】:

您也可以尝试以下使用 np.selectdf.mask() 的几个条件:

s=df['Credit'].fillna(df['Balance']).diff().abs()
cond1=s.ne(df['Debit'])
cond2=s.eq(df['Debit'].shift(-1))
cond3=s.shift().eq(df['Debit'])

values=np.select([(cond1[:,None]&cond2[:,None]),(cond1[:,None]&cond3[:,None])],
          [df.shift(-1),df.shift()])

final=df.mask(cond1&(cond2|cond3),values)
final['Balance']=df['Balance']

  Narration Credit Debit  Balance
1       Abc     15   NaN     15.0
2       Qwe    NaN     5     10.0
3       opr    NaN     3      7.0
4       Wer    NaN     2      5.0
5       Yur      6   NaN     11.0

【讨论】:

  • 如果三行后需要的值那么我该如何移动值..
  • shift(-1) 替换为shift(-2),将shift() 替换为shift(2) 试试? @jainamshah
  • @jainamshah 你还得照顾diff 我猜,但我相信这应该是一个不同的问题
【解决方案2】:

如果我理解正确,你想要:Series.diffnp.where

我们得到Balance中每一行之间的差异,如果这个差异是< 0,那么我们将absolute分配给Debit

mapping_debit = df.dropna(subset=['Debit']).set_index('Debit')['Narration']
mapping_credit = df.dropna(subset=['Credit']).set_index('Credit')['Narration']

balance = df['Balance'].diff().fillna(df['Credit']).fillna(df['Debit'])

df['Credit'] = np.where(balance.ge(0), balance, np.NaN)
df['Debit'] = np.where(balance.lt(0), balance.abs(), np.NaN)

df['Narration'] = df['Debit'].map(mapping_debit).fillna(df['Credit'].map(mapping_credit))

  Narration  Credit  Debit  Balance
0       Abc    15.0    NaN     15.0
1       Qwe     NaN    5.0     10.0
2       Wer     NaN    3.0      7.0
3       opr     NaN    2.0      5.0
4       Yur     6.0    NaN     11.0

注意我们必须导入numpy:

import numpy as np

【讨论】:

  • 毫无疑问希望这种平衡不会改变
  • 如果信用额度与余额不匹配,那么......我不会为此结合条件......
  • 对不起,我不确定你想说什么。 @jainamshah
  • 如果信用卡出现同样的问题,我该怎么办??
  • InvalidIndexError:重新索引仅对具有唯一值的索引对象有效
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-08
  • 2014-09-08
  • 2011-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多