[英]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.