Java использует управляемую память, поэтому единственным способом выделения памяти является использование оператора new
, и единственный способ освободить память - это использовать сборщик мусора.
Это . (PDF) может помочь объяснить, что происходит.
Вы также можете вызвать System.gc()
, чтобы предположить, что сборщик мусора запускается немедленно. Тем не менее, Java Runtime принимает окончательное решение, а не ваш код.
Согласно документации Java ,
Вызов метода gc предполагает, что виртуальная машина Java тратит усилия на переработку неиспользуемых объектов, чтобы сделать память, которую они в настоящее время занимают, для быстрого повторного использования. Когда управление возвращается из вызова метода, виртуальная машина Java прилагает все усилия, чтобы освободить место от всех отброшенных объектов.
blockquote>
Из того, что я понимаю, вы можете попытаться сделать:
df['new_status']=(df.groupby('Customer')['Status'].
transform(lambda x: x.eq('canceled').all()).map({True:'cancelled'})).fillna(df.new_status)
print(df)
Customer Status new_status duplicated
0 X canceled 0
1 X canceled 1
2 X active 2
3 Y canceled cancelled 0
4 A canceled cancelled 0
5 A canceled cancelled 1
6 B active 0
7 B canceled 1
РЕДАКТИРОВАТЬ, так как ожидаемое o / p было изменено:
df['new_status']=(df.groupby('Customer')['Status'].
transform(lambda x: x.duplicated(keep=False)&(x.eq('canceled').all()))
.map({True:'cancelled',False:''}))
print(df)
Customer Status new_status duplicated
0 X canceled 0
1 X canceled 1
2 X active 2
3 Y canceled 0
4 A canceled cancelled 0
5 A canceled cancelled 1
6 B active 0
7 B canceled 1
Сравните столбец по Series.eq
для ==
и используйте GroupBy.transform
с GroupBy.all
для проверки, все ли значения равны True
с по группам, затем сравните Customer
по Series.duplicated
с keep=False
для возврата всех дупликов. Последняя цепочка вместе поразрядно AND
(&
) и установить значения по numpy.where
:
m1 = df['Status'].eq('canceled').groupby(df['Customer']).transform('all')
m2 = df['Customer'].duplicated(keep=False)
df['new_status'] = np.where(m1 & m2, 'cancelled', '')
print (df)
Customer Status new_status duplicated
0 X canceled 0
1 X canceled 1
2 X active 2
3 Y canceled 0
4 A canceled cancelled 0
5 A canceled cancelled 1
6 B active 0
7 B canceled 1