Применить биннинг с другим размером бина во всех столбцах данных - PullRequest
2 голосов
/ 06 марта 2020

У меня тривиальный вопрос. У меня очень большой df с большим количеством столбцов. Я пытаюсь найти наиболее эффективный способ, чтобы объединить все столбцы с разными размерами и создать новый df. Вот пример для размещения только одного столбца:

import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.randint(0,20,size=(5, 4)), columns=list('ABCD'))
newDF = pd.cut(df.A, 2, precision=0)
newDF 
0    (9.0, 18.0]
1    (-0.0, 9.0]
2    (-0.0, 9.0]
3    (-0.0, 9.0]
4    (9.0, 18.0]
Name: A, dtype: category
Categories (2, interval[float64]): [(-0.0, 9.0] < (9.0, 18.0]]

1 Ответ

2 голосов
/ 06 марта 2020

Если вы хотите обрабатывать каждый столбец отдельно, используйте DataFrame.apply:

df = pd.DataFrame(np.random.randint(0,20,size=(5, 4)), columns=list('ABCD'))
newDF = df.apply(lambda x: pd.cut(x, 2, precision=0))
print (newDF)
            A            B             C             D
0  (2.0, 4.0]  (8.0, 15.0]   (7.0, 13.0]  (12.0, 18.0]
1  (2.0, 4.0]  (8.0, 15.0]   (7.0, 13.0]  (12.0, 18.0]
2  (4.0, 7.0]  (8.0, 15.0]  (13.0, 19.0]  (12.0, 18.0]
3  (4.0, 7.0]  (8.0, 15.0]   (7.0, 13.0]   (5.0, 12.0]
4  (4.0, 7.0]   (1.0, 8.0]   (7.0, 13.0]   (5.0, 12.0]

Если хотите обрабатывать все столбцы одинаковыми ячейками, используйте DataFrame.stack для MultiIndex Series, примените cut и измените форму на Series.unstack:

newDF = pd.cut(df.stack(), 2, precision=0).unstack()
print (newDF)
              A             B             C             D
0  (10.0, 19.0]  (10.0, 19.0]  (10.0, 19.0]  (-0.0, 10.0]
1  (10.0, 19.0]  (10.0, 19.0]  (-0.0, 10.0]  (-0.0, 10.0]
2  (-0.0, 10.0]  (10.0, 19.0]  (-0.0, 10.0]  (-0.0, 10.0]
3  (-0.0, 10.0]  (-0.0, 10.0]  (10.0, 19.0]  (-0.0, 10.0]
4  (10.0, 19.0]  (10.0, 19.0]  (-0.0, 10.0]  (-0.0, 10.0]
...