Панды "вырезать" на основе другой колонны - PullRequest
1 голос
/ 08 мая 2019

Я хочу использовать pd.cut (для преобразования непрерывных переменных в дискретные) в некоторые переменные моего фрейма данных pandas, но я хочу, чтобы это сокращение зависело от другого столбца.Представьте, что я хочу 3 ячейки.

Например:

+------+------+------+--------+
| col1 | col2 | col3 | sector |
+------+------+------+--------+
| 4.5  | 6    | 7    | a      |
+------+------+------+--------+
| 8    | 9    | 17   | a      |
+------+------+------+--------+
| 0    | 9    | 8    | b      |
+------+------+------+--------+
| 8    | 9    | 0    | b      |
+------+------+------+--------+
| 1    | 2    | 3.5  | b      |
+------+------+------+--------+

Я хочу разрезать только col1 и col2 на 3 ячейки на основе sector, так что для каждогосектор порез выполняется.Это очень полезно для сравнения переменных из разных источников.

Результат будет (он составлен, не ожидайте, что он будет точным на 100%):

+----------+----------+------+--------+
| col1_cut | col2_cut | col3 | sector |
+----------+----------+------+--------+
| 2        | 2        | 7    | a      |
+----------+----------+------+--------+
| 3        | 3        | 17   | a      |
+----------+----------+------+--------+
| 1        | 3        | 8    | b      |
+----------+----------+------+--------+
| 3        | 3        | 0    | b      |
+----------+----------+------+--------+
| 1        | 1        | 3.5  | b      |
+----------+----------+------+--------+

PS: я сделал это Q & A, потому что у меня была эта проблема и я не мог найти решение самостоятельно.Не стесняйтесь ответить на собственное решение или улучшить мое, я ценю обратную связь.

Ответы [ 2 ]

2 голосов
/ 08 мая 2019

Я думаю, что можно сократить как

s=pd.concat([y[['col1','col2']].apply(pd.cut,bins=3,labels=False)for x, y in df.groupby('sector')])
s
Out[157]: 
   col1  col2
0     0     0
1     2     2
2     0     2
3     2     2
4     0     0

df.update(s)
1 голос
/ 08 мая 2019

Для выполнения этой операции вам нужно только:

col_add = []

sectors = df['sector'].unique()

for col in df.columns:
    if col in ['col1','col2']:
        col_add.append(col)
        df['{}_cut'.format(col)] = 0 # Initialized (not needed but I like to)
        for sector in sectors:
            df['{}_cut'.format(col)][df['sector'] == sector] = pd.cut(df[col][df['sector'] == sector], 3, labels=False)

df.drop(col_add, axis = 1, inplace = True) # Remove old cols
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...