아미(아름다운미소)

b컬럼이 음수면 -1을 해당수만큼넣고 양수면 1을 해당수만큼 넣기 본문

랭귀지/pandas

b컬럼이 음수면 -1을 해당수만큼넣고 양수면 1을 해당수만큼 넣기

유키공 2024. 8. 12. 21:29
import pandas as pd

# 예시 데이터프레임
grouped = pd.DataFrame({
    'a': [...],
    'b': [...],
    'c': [...],
    'd': [...],
    'remainder': [...]
})

# 'remqainder_add' 컬럼 초기화
grouped['remqainder_add'] = 0

# 그룹별로 remainder의 값을 가져와서 fill_count 계산
grouped['fill_count'] = grouped.groupby(['a', 'b', 'c', 'd'])['remainder'].transform(lambda x: min(x.iloc[0], len(x)))

# 조건에 맞는 인덱스에 1로 업데이트
mask = grouped.index < grouped.groupby(['a', 'b', 'c', 'd']).cumcount() + grouped['fill_count']
grouped.loc[mask, 'remqainder_add'] = 1

# 불필요한 fill_count 컬럼 제거
grouped.drop(columns='fill_count', inplace=True)
import pandas as pd
import numpy as np

# 샘플 데이터 생성
data = {
    'a': ['A'] * 6 + ['B'] * 6 + ['C'] * 6,
    'b': [10, 15, 10, -20, 5, 10,
          25, -30, 5, 20, 15, 10,
          10, 15, 20, 25, 30, 35],
    'c': [3, 3, 3, 3, 3, 3,
          -3, -3, -3, -3, -3, -3,
          2, 2, 2, 2, 2, 2]
}

# DataFrame 생성
df = pd.DataFrame(data)

# d 컬럼 초기화
df['d'] = np.nan

# 각 그룹의 c 값에 따라 d 값을 설정
counts = df.groupby('a')['c'].transform('first')

# d 값을 초기화
df['d'] = np.where(counts > 0, 1, np.where(counts < 0, -1, np.nan))

# 그룹별 c의 절대값만큼 d 값 유지
group_sizes = df.groupby('a')['d'].transform(lambda x: x.cumsum().where(x.notnull()).ffill())

# c의 절대값에 따른 조건 설정
df['d'] = np.where(counts > 0, np.where(group_sizes <= counts, 1, np.nan), df['d'])
df['d'] = np.where(counts < 0, np.where(group_sizes <= -counts, -1, df['d']), df['d'])

# 결과 출력
print(df[['a', 'b', 'c', 'd']])
import pandas as pd
import numpy as np

# 샘플 데이터 생성
data = {
    'a': ['A'] * 6 + ['B'] * 6 + ['C'] * 6,
    'b': [10, 15, 10, -20, 5, 10,
          25, -30, 5, 20, 15, 10,
          10, 15, 20, 25, 30, 35],
    'c': [3, 3, 3, 3, 3, 3,
          -3, -3, -3, -3, -3, -3,
          2, 2, 2, 2, 2, 2]
}

# DataFrame 생성
df = pd.DataFrame(data)

# d 컬럼 초기화
df['d'] = np.nan

# 각 그룹별로 d 컬럼 채우기
for name, group in df.groupby('a'):
    if not group.empty:  # 그룹이 비어있지 않은지 체크
        count = group['c'].iloc[0]  # 첫 번째 행의 c 값을 가져옴

        if count > 0:
            fill_count = min(count, len(group))  # c 값과 그룹 길이 중 작은 값
            df.loc[group.index[:fill_count], 'd'] = 1  # c가 양수일 경우 1로 채움
        elif count < 0:
            fill_count = min(abs(count), len(group))  # 절대값과 그룹 길이 중 작은 값
            df.loc[group.index[:fill_count], 'd'] = -1  # c가 음수일 경우 -1로 채움

# 결과 출력
print(df[['a', 'b', 'c', 'd']])
import pandas as pd
import numpy as np

# 샘플 데이터 생성
data = {
    'a': ['A'] * 6 + ['B'] * 6 + ['C'] * 6,  # 각 카테고리마다 6개 데이터
    'b': [10, 15, 10, -20, 5, 10,  # A 카테고리
          25, -30, 5, 20, 15, 10,  # B 카테고리
          10, 15, 20, 25, 30, 35], # C 카테고리
    'c': [3, 3, 3, 3, 3, 3,  # A 카테고리의 c 값 (항상 동일)
          -3, -3, -3, -3, -3, -3,  # B 카테고리
          2, 2, 2, 2, 2, 2]   # C 카테고리
}

# DataFrame 생성
df = pd.DataFrame(data)

# d 컬럼 생성: c 컬럼의 숫자에 따라 양수는 1, 음수는 -1로 채우기
def assign_values(group):
    count = group['c'].iloc[0]  # 첫 번째 행의 c 값을 가져옴
    d_values = [np.nan] * len(group)  # 그룹의 크기에 맞춰 NaN으로 초기화

    if count > 0:
        d_values[:count] = [1] * count  # c가 양수일 경우 1로 채움
    elif count < 0:
        d_values[:abs(count)] = [-1] * abs(count)  # c가 음수일 경우 -1로 채움
    else:
        d_values[:] = [0] * len(group)  # c가 0일 경우 모든 값 0으로 채움

    return pd.Series(d_values, index=group.index)

# 그룹별로 d 컬럼 할당
df['d'] = df.groupby('a').apply(assign_values).reset_index(drop=True)

# 결과 출력
print(df[['a', 'b', 'c', 'd']])
import pandas as pd
import numpy as np

# 예시 DataFrame 생성 (a 컬럼에 임의의 값이 들어있음)
data = {
    'a': ['x', 'y', 'z', 'a', 'b', 'c'],  # 임의의 값
    'b': [3, 3, 3, 3, 3, 3]  # b 컬럼의 값이 동일
}
df = pd.DataFrame(data)

# a 컬럼을 오름차순으로 정렬
df = df.sort_values(by='a').reset_index(drop=True)

# b 컬럼의 값 가져오기
if not df['b'].empty:  # b 컬럼이 비어있지 않은 경우
    b_value = df['b'].iloc[0]  # b 컬럼의 첫 번째 값을 가져옴
else:
    b_value = 0  # b 컬럼이 비어있으면 기본값 0으로 설정

# c 컬럼 생성
if b_value > 0:
    c_values = [1] * b_value + [np.nan] * (len(df) - b_value)  # 양수일 경우 1을 해당 수만큼
elif b_value < 0:
    c_values = [-1] * abs(b_value) + [np.nan] * (len(df) - abs(b_value))  # 음수일 경우 -1을 해당 수만큼
else:
    c_values = [np.nan] * len(df)  # b가 0일 경우 모두 np.nan

# c 컬럼의 길이를 맞추기 위해 필요한 만큼 np.nan 추가
c_values.extend([np.nan] * (len(df) - len(c_values)))

# c 컬럼을 DataFrame에 추가
df['c'] = c_values[:len(df)]  # c 컬럼 길이에 맞게 잘라서 추가

# 결과 출력
print(df)
Comments