如何根据特定列在Pandas Dataframe中向上移动行

时间:2019-11-18 17:38:39

标签: python pandas

如何在不影响其他列顺序的情况下将某一特定列的所有值上移?

例如,假设我有以下代码:

import pandas as pd
data= {'ColA':["A","B","C"],
        'ColB':[0,1,2],
        'ColC':["First","Second","Third"]}

df = pd.DataFrame(data)

print(df)

我将看到以下输出:

  ColA  ColB    ColC
0    A     0   First
1    B     1  Second
2    C     2   Third

就我而言,我想验证列B没有任何0,如果是,则将其删除,并将其下的所有其他值上推,并且其他列的顺序不受影响。大概我会看到以下内容:

  ColA  ColB    ColC
0    A   1     First
1    B   2    Second
2    C   NaN   Third

我不知道如何使用drop()或shift()方法做到这一点。

谢谢

3 个答案:

答案 0 :(得分:2)

让我们做简单的sorted

invalid=0
df['ColX']=sorted(df.ColB,key=lambda x : x==invalid)
df.ColX=df.ColX.mask(df.ColX==invalid)
df
Out[351]: 
  ColA  ColB    ColC  ColX
0    A     0   First   1.0
1    B     1  Second   2.0
2    C     2   Third   NaN

答案 1 :(得分:1)

我执行IIUC的方法是过滤ColB中不是0的值,并根据获得的有效值的长度用这些值填充列: / p>

m = df.loc[~df.ColB.eq(0), 'ColB'].values
df['ColB'] = float('nan')
df.loc[:m.size-1, 'ColB'] = m

print(df)

 ColA  ColB    ColC
0    A   1.0   First
1    B   2.0  Second
2    C   NaN   Third

答案 2 :(得分:0)

您可以将 0s 换为 nans ,然后将其余值上移:

import numpy as np
df.ColB.replace(0, np.nan, inplace=True)
df.assign(ColB=df.ColB.shift(df.ColB.count() - len(df.ColB)))