熊猫根据条件移动列数据

时间:2018-07-05 06:06:40

标签: python pandas if-statement indexing multiple-columns

我有dataframe,看起来像这样。

    Name    Val Rating  
0   ABC     123 B + 
1   DEF     234 B + 
2   567     B-  NaN
3   GHI     890 D

但是我想通过检查(col['Name'])到下一个列(col['Val'])并依次进行移位来移动数据。另外,如果发生移位,请更改行index的值。我想要以下dataframe作为输出。

    Name    Val Rating  
0   ABC     123 B + 
1   DEF     234 B + 
    NaN     567 B - 
2   GHI     890 D

有人知道该怎么做吗?

4 个答案:

答案 0 :(得分:5)

您可以按布尔掩码移动行:

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

详细信息

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

如果确实需要将索引值替换为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

答案 1 :(得分:3)

df[df['Rating'].isnull()]=df[df['Rating'].isnull()].shift(axis=1)
print(df)

输出:

  Name  Val Rating
0  ABC  123    B +
1  DEF  234    B +
2  NaN  567     B-
3  GHI  890      D

编辑:

df[df['Rating'].isnull()|df['Name'].isnull()]=df[df['Rating'].isnull()|df['Name'].isnull()].shift(axis=1)
print(df)

答案 2 :(得分:1)

使用isdigit

df[df['Name'].str.isdigit()] = df[df['Name'].str.isdigit()].shift(axis=1)

输出:

    Name  Val Rating
0  ABC  123      B +
1  DEF  234      B +
2  NaN  567      B-
3  GHI  890      D

答案 3 :(得分:-2)

首先定义一个函数:

import numpy as np

def f1(row):
    if not row.rating:
         row.Rating = row.val
         row.val = row.Name
         row.Name = np.NaN

然后使用pandas.DataFrame.apply

df.apply(f1,axis=1)