How to delete pandas values based on condition and accordingly shift the rows

时间:2018-03-08 22:15:53

标签: python python-3.x pandas dataframe

For examples, I have a DataFrame like this:

       Rank #1       Rank #2      Rank #3        Rank #4     status 
0        A             B            D               C          in
1        B             C            A               D          out
2        A             D            C               B          in
3        A             B            C               D          out
4        D             C            B               A          out
5        D             A            C               B          out 
...

How can I delete A values if status == out and then shift the other row ranking values to the left?

My expected outcome is:

     Rank #1       Rank #2      Rank #3        Rank #4     status 
0        A             B            D               C        in
1        B             C            D                        out
2        A             D            C               B        in
3        B             C            D                        out
4        D             C            B                        out
5        D             C            B                        out
...

1 个答案:

答案 0 :(得分:1)

这是一种方式。

import pandas as pd, numpy as np

df = pd.DataFrame({1: ['A', 'B', 'A','A', 'D', 'D'],
                   2: ['B', 'C', 'D', 'B', 'C', 'A'],
                   3: ['D', 'A', 'C', 'C', 'B', 'C'],
                   4: ['C', 'D', 'B', 'D', 'A', 'B'],
                   'status': ['in', 'out', 'in', 'out', 'out', 'out']})

mask = df['status'] == 'out'
df.loc[mask, :] = df.loc[mask, :].replace('A', '')

A = [list(''.join(i)) for i in df.iloc[:, :-1].values]

df_res = pd.DataFrame(A).fillna('').assign(result=df.status)

<强>结果

   0  1  2  3 result
0  A  B  D  C     in
1  B  C  D       out
2  A  D  C  B     in
3  B  C  D       out
4  D  C  B       out
5  D  C  B       out

<强>解释

  1. 替换&#34; A&#34;选定行的空字符串。
  2. 通过列表理解将条目移到左侧。
  3. 创建结果数据框并添加回状态&#34;状态&#34;列。