如何在不影响其他列顺序的情况下将某一特定列的所有值上移?
例如,假设我有以下代码:
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()方法做到这一点。
谢谢
答案 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)))