2017-10-04 3 views
1

ID가 연결된 값이 있고 각 값에 대한 ID가 포함 된 Pandas DataFrame이 있고 초기 값을 중심으로 한 값을 갖는 새 열을 만들고 싶습니다. 결정 가능 금액. 내 초기 데이터는 다음과 같습니다.Python을 사용하여 다른 열에 의존하는 범위의 값을 가진 열 만들기

iD  Value 
AAAA 10 
AAAA 15 
AAAA 5 
BBBB 10 
BBBB 6 
BBBB 11 
CCCC 8 
CCCC 16 
CCCC 14 

코드는 다음과 같습니다. 여기서 범위는 +/- 1로 설정됩니다.

내가 얻고 싶은 것은;

iD  Value NewVal 
AAAA 10  9 
AAAA 10  10 
AAAA 10  11 
AAAA 15  14 
AAAA 15  15 
AAAA 15  16 
AAAA 5  4 
AAAA 5  5 
AAAA 5  6 
BBBB 10  9 
BBBB 10  10 
BBBB 10  11 
BBBB 6  5 
BBBB 6  6 
BBBB 6  7  
BBBB 11  10 
BBBB 11  11 
BBBB 11  12 
CCCC 8  7 
CCCC 8  8 
CCCC 8  9 
CCCC 16  14 
CCCC 16  15 
CCCC 16  16 
CCCC 14  13 
CCCC 14  14 
CCCC 14  15 

모든 요령이나 제안은 크게 감사하겠습니다.

감사합니다.

+0

당신은 작업중인 데이터 구조의 어떤 종류의? 목록 목록 또는 팬더 데이터 프레임입니까? 아니면 다른 것입니까? –

+0

사과, 판다 데이터 프레임 – Taylrl

+1

이 경우 [tag : pandas] 태그를 추가하고 텍스트에서 'DataFrame'으로 작업하고 있음을 명시하여 질문을 편집해야합니다. 문제를 설명하는 [짧지 만 완전한 예제 프로그램] (https://stackoverflow.com/help/mcve)을 포함 할 수 있다면 도움이 될 것입니다. 당신은 샘플 데이터를 가지고'DataFrame'을 생성하는 약간의 코드를 포함하도록 게시 한 샘플 코드를 확장 할 수 있습니다. 목표는 사람들이 파일에 복사하여 붙여 넣을 수있는 것을 얻은 다음 문제를 재현하기 위해 실행하는 것입니다. 감사합니다 @ pixRSared. –

답변

3

옵션 1
간단한 옵션 2
또는 다시 전체 dataframe loc

df.loc[df.index.repeat(3)].assign(
    NewVal=(df.Value.values[:, None] + [-1, 0, 1]).ravel()) 

i = df.iD.values 
v = df.Value.values 

pd.DataFrame(
    np.column_stack([ 
     i.repeat(3), 
     v.repeat(3), 
     (v[:, None] + [-1, 0, 1]).ravel() 
    ]), columns=['iD', 'Value', 'NewVal'] 
) 

두 옵션 모두 NumPy와 방송을 사용하여 값 [-1, 0, 1]를 추가 사용할 수 있도록 다음

 iD Value NewVal 
0 AAAA 10  9 
1 AAAA 10  10 
2 AAAA 10  11 
3 AAAA 15  14 
4 AAAA 15  15 
5 AAAA 15  16 
6 AAAA  5  4 
7 AAAA  5  5 
8 AAAA  5  6 
9 BBBB 10  9 
10 BBBB 10  10 
11 BBBB 10  11 
12 BBBB  6  5 
13 BBBB  6  6 
14 BBBB  6  7 
15 BBBB 11  10 
16 BBBB 11  11 
17 BBBB 11  12 
18 CCCC  8  7 
19 CCCC  8  8 
20 CCCC  8  9 
21 CCCC 16  15 
22 CCCC 16  16 
23 CCCC 16  17 
24 CCCC 14  13 
25 CCCC 14  14 
26 CCCC 14  15 
+0

. 내가 필요로하는 핵심 사항 중 하나는 범위가 결정될 수 있다는 것입니다. 나는'[-1,0,1]'과 함께 반복 횟수를 변경하여 +/- 1을 변경하려했지만 아무 소용이 없습니다. – Taylrl

1

pandas.repeatravelgroupby을 사용하고 올라가지

df1=df.loc[df.index.repeat(3)] 
import operator 
df1.groupby(['iD','Value'],as_index=False).apply(lambda x :list(map(operator.sub, x['Value'], [1,0,-1]))).\ 
    apply(pd.Series).stack().reset_index().\ 
     drop('level_2',1).rename(columns={0:'New'}) 

Out[253]: 
     iD Value New 
0 AAAA  5 4 
1 AAAA  5 5 
2 AAAA  5 6 
3 AAAA  10 9 
4 AAAA  10 10 
5 AAAA  10 11 
6 AAAA  15 14 
7 AAAA  15 15 
8 AAAA  15 16 
9 BBBB  6 5 
10 BBBB  6 6 
11 BBBB  6 7 
12 BBBB  10 9 
13 BBBB  10 10 
14 BBBB  10 11 
15 BBBB  11 10 
16 BBBB  11 11 
17 BBBB  11 12 
18 CCCC  8 7 
19 CCCC  8 8 
20 CCCC  8 9 
21 CCCC  14 13 
22 CCCC  14 14 
23 CCCC  14 15 
24 CCCC  16 15 
25 CCCC  16 16 
26 CCCC  16 17 
관련 문제