Замените значение на это значение, деленное на количество раз, которое значение существует в pandas - PullRequest
1 голос
/ 06 января 2020

У меня есть следующий фрейм данных

ID    Unit_ID       Price
1     1             50
2     2             40
3     1             10000
3     2             10000
3     3             10000
3     4             10000
6     1             10000
8     3             10000

С указанного выше фрейма данных я хочу заменить Price = 10000 на количество строк с одинаковым ID и Price = 10000, здесь это число = 4

Ожидаемый результат:

  ID    Unit_ID       Price
    1     1             50
    2     2             40
    3     1             2500
    3     2             2500
    3     3             2500
    3     4             2500
    6     1             10000
    8     3             10000

Ответы [ 2 ]

1 голос
/ 06 января 2020

Если вы просто хотите заменить строки на 10000, вы можете сделать:

df.loc[df.Price==10000, 'Price']=10000/len(df.loc[df.Price==10000])

Если вы хотите разделить каждую строку с количеством значений, вы можете использовать groupby и преобразование:

df.Price = df.groupby(by="Price").Price.transform(lambda x: x/len(x))


    ID  Unit_ID Price
0   1   1       50
1   2   2       40
2   3   1       2500
3   3   2       2500
4   3   3       2500
5   3   4       2500
1 голос
/ 06 января 2020

Создать маску и разделить отфильтрованные строки на количество True s значений на sum:

mask = df.Price == 10000

df.loc[mask, 'Price'] /= mask.sum()
#same like
#df.loc[mask, 'Price'] = df.loc[mask, 'Price'] / mask.sum()
print (df)
   ID  Unit_ID   Price
0   1        1    50.0
1   2        2    40.0
2   3        1  2500.0
3   3        2  2500.0
4   3        3  2500.0
5   3        4  2500.0

Если вы хотите разделить все значения по их количеству:

df['Price'] /= df.groupby(by="Price")['Price'].transform('size')

РЕДАКТИРОВАТЬ:

df['Price'] /= df.groupby(by=["ID", "Price"])['Price'].transform('size')
print (df)
   ID  Unit_ID    Price
0   1        1     50.0
1   2        2     40.0
2   3        1   2500.0
3   3        2   2500.0
4   3        3   2500.0
5   3        4   2500.0
6   6        1  10000.0
7   8        3  10000.0
...