繁体   English   中英

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

[英]How to shift rows up in Pandas Dataframe based on specific column

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

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

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

df = pd.DataFrame(data)

print(df)

我会看到以下 output:

  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() 方法来做到这一点。

谢谢

让我们做简单的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

我这样做 IIUC 的方法是过滤掉ColB中不是0的值,并根据获得的有效值的长度用这些值填充列:

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

您可以将0换成nans ,然后向上移动值的 rest:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM