R скрипт в код Python

1

Я начинаю копать глубже в Python, и мне трудно преобразовать некоторые из моих R-скриптов в Python. У меня есть функция, определенная в R:

Shft_Rw <- function(x) { for (row in 1:nrow(x))
{
  new_row = x[row , c(which(!is.na(x[row, ])), which(is.na( x[row, ])))]
  colnames(new_row) = colnames(x)
  x[row, ] = new_row
}
  return(x)  
}

Что по существу принимает ведущий NA каждой строки в фрейме данных и помещает их в конец строки, т.е.

import pandas as pd
import numpy as np
df =pd.DataFrame({'a':[np.nan,np.nan,3],'b':[3,np.nan,5],'c':[3, 4,5]})

df
Out[156]: 
     a    b  c
0  NaN  3.0  3
1  NaN  NaN  4
2  3.0  5.0  5

превращается в:

df2 =pd.DataFrame({'a':[3,4,3],'b':[3,np.nan,5],'c':[np.nan, np.nan,5]})
df2
Out[157]: 
   a    b    c
0  3  3.0  NaN
1  4  NaN  NaN
2  3  5.0  5.0

Пока у меня есть:

def Shft_Rw(x):
    for row in np.arange(0,x.shape[0]):
        new_row = x.iloc[row,[np.where(pd.notnull(x.iloc[row])),np.where(pd.isnull(df.iloc[row]))]]

Но бросать ошибки. Используя пример df выше, я могу получить индекс строки, используя iloc и позиции столбца, где он имеет значение null/not null (с использованием where()), но не может совместить два (попробовал множество вариантов с большим количеством скобок и т.д.).

df.iloc[1]
Out[170]: 
a    NaN
b    NaN
c    4.0

np.where(pd.isnull(df.iloc[1]))
In[167] :  np.where(pd.isnull(df.iloc[1]))
Out[167]: (array([0, 1], dtype=int64),)

df.iloc[1,np.where(pd.notnull(df.iloc[1]))]

Любой, кто может помочь реплицировать функцию AND/OR, показывает более эффективный способ решения проблемы?

Спасибо!

  • 0
    Что должно случиться со строкой, такой как «2 NaN 3»? Является ли ожидаемый выходной сигнал "2 NaN 3" или "3 2 NaN"?
  • 0
    Для моей конкретной цели анализа я бы сделал либо прямое заполнение последним фактическим результатом, либо простую линейную интерполяцию, т. Е. (2, 2, 3) или (2, 2,5, 3). Более того, если бы исходная строка была (NA, NA, 2, NA, 3), я бы хотел, чтобы она была преобразована в: (2, 2, 3, NA, NA) Я еще не видел ни одного случая в моем наборе данных, но большой вопрос - я уверен, что такой случай может возникнуть.
Теги:
pandas
python-3.x

1 ответ

2
Лучший ответ

Использование apply с dropna:

df1 = df.apply(lambda x: pd.Series(x.dropna().values), axis=1)
df1.columns = df.columns
print (df1)
     a    b    c
0  3.0  3.0  NaN
1  4.0  NaN  NaN
2  3.0  5.0  5.0

Если производительность важна, я предлагаю использовать эту идеальную функцию:

arr = justify(df.values, invalid_val=np.nan, axis=1, side='left')
df1 = pd.DataFrame(arr, index=df.index, columns=df.columns)
print (df1)
     a    b    c
0  3.0  3.0  NaN
1  4.0  NaN  NaN
2  3.0  5.0  5.0
  • 0
    Потрясающие! Это сработало - просто нужно было сделать один промежуточный шаг. Очевидно, использование groupby изменяет nans на 0, так что просто нужно было сделать .replace (0, np.nan) перед вашим решением. Спасибо!
  • 0
    @HowdyDude - Добро пожаловать! Спасибо, что приняли1. Вы тоже можете проголосовать, нажав на маленький треугольник выше 0 выше принимающей отметки. Благодарю.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню