Панда смещает данные столбца при условии - PullRequest
0 голосов
/ 05 июля 2018

У меня есть 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 голосов
/ 05 июля 2018
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

Edit:

df[df['Rating'].isnull()|df['Name'].isnull()]=df[df['Rating'].isnull()|df['Name'].isnull()].shift(axis=1)
print(df)
0 голосов
/ 05 июля 2018

сначала определите функцию:

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)
0 голосов
/ 05 июля 2018

Использование 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
0 голосов
/ 05 июля 2018

Вы можете сдвигать строки по логической маске:

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 строк, возможно создать помощник Series и reindex.

Но это не рекомендуется, поскольку проблема с производительностью и возможная ошибка некоторых функций с этим индексом.

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
...