Как удалить пропущенные данные и нули, сохраняя при этом данные в одной и той же форме, используя Pandas? - PullRequest
1 голос
/ 06 июля 2019

У меня есть фрейм данных, и я хочу переформатировать его, чтобы он удалял экземпляры пропущенного значения или нуля до того, как первое ненулевое значение появится в строке.Однако я не хочу удалять строки или столбцы и не хочу удалять 0 или отсутствующие значения, которые появляются после ненулевых значений.

Ниже приведен фрейм данных, с которым я работаю:

> data =[['Adam',2.55,4.53,3.45,2.12,3.14],['Bill',np.NaN,2.14,3.65,4.12],['Chris',np.NaN,0,2.82,0,6.04],['David',np.NaN,0,7.42,3.52]]

> df = pd.DataFrame(data, columns = ['Name', 'A','B','C','D','E'])

Кроме того, вот ожидаемый результат:

> data1 =[['Adam',2.55,4.53,3.45,2.12,3.14],['Bill',2.14,3.65,4.12],['Chris',2.82,0,6.04],['David',7.42,3.52]]

> df1 = pd.DataFrame(data1, columns = ['Name', 'A','B','C','D','E']) 

1 Ответ

1 голос
/ 06 июля 2019

Это не тривиальная проблема.Вот решение:

m=df.set_index('Name')
m=m[m.isin(m.mask(m.le(0)).bfill(axis=1).iloc[:,0]).cumsum(axis=1).astype(bool)]
print(m)

         A     B     C     D     E
Name                               
Adam   2.55  4.53  3.45  2.12  3.14
Bill    NaN  2.14  3.65  4.12   NaN
Chris   NaN   NaN  2.82  0.00  6.04
David   NaN   NaN  7.42  3.52   NaN

Затем с помощью justify:

pd.DataFrame(justify(m.values,np.nan),columns=m.columns,index=m.index).reset_index()

    Name     A     B     C     D     E
0   Adam  2.55  4.53  3.45  2.12  3.14
1   Bill  2.14  3.65  4.12   NaN   NaN
2  Chris  2.82  0.00  6.04   NaN   NaN
3  David  7.42  3.52   NaN   NaN   NaN

Объяснение:

Step1: Установите столбец Name в качестве индекса, чтобы мы могли работать только с числовыми значениями. Step2: m.mask(m.le(0)).bfill(axis=1).iloc[:,0] дает первое значение, которое больше 0. Step3: Затем с помощью isin() возвращается True везде, где значение появляется в каждой строке. Step4: cumsum(axis=1).astype(bool) делает все остальные элементы равными True, поэтому мы можем фильтровать только эти значения, другие значения становятся NaN.Тогда используйте функцию выравнивания из связанного поста.

...