熊猫在条件下移动列数据

abh*_*610 4 python indexing if-statement multiple-columns pandas

dataframe看起来像这样.

    Name    Val Rating  
0   ABC     123 B + 
1   DEF     234 B + 
2   567     B-  NaN
3   GHI     890 D
Run Code Online (Sandbox Code Playgroud)

但我想通过检查(col['Name'])下一列(col['Val'])并连续移位来移动数据.此外,如果发生移位,则更改行index值.我希望以下dataframe作为输出.

    Name    Val Rating  
0   ABC     123 B + 
1   DEF     234 B + 
    NaN     567 B - 
2   GHI     890 D
Run Code Online (Sandbox Code Playgroud)

有人知道怎么做吗?

jez*_*ael 6

您可以通过布尔掩码移动行:

mask = pd.to_numeric(df['Name'], errors='coerce').notnull()
df[mask] = df[mask].shift(axis=1)
print (df)
  Name  Val Rating
0  ABC  123    B +
1  DEF  234    B +
2  NaN  567     B-
3  GHI  890      D
Run Code Online (Sandbox Code Playgroud)

细节:

print (pd.to_numeric(df['Name'], errors='coerce'))
0      NaN
1      NaN
2    567.0
3      NaN
Name: Name, dtype: float64
Run Code Online (Sandbox Code Playgroud)

如果确实需要将索引值替换为empty字符串,则可以创建帮助器Seriesreindex.

但是不建议这样做,因为性能问题以及此索引可能的某些功能应该失败.

i = df.index[~mask]
df.index = pd.Series(range(len(i)), index=i).reindex(df.index, fill_value='')
print (df)
  Name  Val Rating
0  ABC  123    B +
1  DEF  234    B +
   NaN  567     B-
2  GHI  890      D
Run Code Online (Sandbox Code Playgroud)