2017-12-27 4 views
1

내 원래 CSV 파일은 내가 결과다른 열의 패턴을 표시하는 DataFrame에 새 열을 어떻게 만들 수 있습니까?

for grp, val in df.groupby((df.diff()-1).fillna(0).cumsum().index1): 
print(val) 

과 열 A에 연속 정수의 테이블을 그룹화이

1, 9 
2, 8 
3, 9 
14, 7 
15, 6 
19, 8 
20, 9 
21, 3 

과 같은 테이블 : 실제로

A B 
1 1 9 
2 2 8 
3 3 9 
    A B 
14 14 7 
15 15 6 
    A B 
19 19 8 
20 20 9 
21 21 3 

는 B 값은 매우 긴 ID 번호지만 숫자만큼 중요하지 않습니다. 각 ID에 간단한 값을 할당하고 그룹의 각 중복에 대해 동일한 간단한 값을 할당하여 세 그룹의 패턴을 보여주는 새로운 열 C를 어떻게 만들 수 있습니까?

원하는 출력 :

A B C 
1 1 9 1 
2 2 8 2 
3 3 9 1 
    A B C 
14 14 7 1 
15 15 6 2 
    A B C 
19 19 8 1 
20 20 9 2 
21 21 3 3 

감사

답변

1

당신은 가까운

df['C']=df.groupby((df.A.diff()-1).fillna(0).cumsum()).B.apply(lambda x : pd.Series(pd.factorize(x)[0]+1)).values 
df 
Out[105]: 
    A B C 
0 1 9 1 
1 2 8 2 
2 3 9 1 
3 14 7 1 
4 15 6 2 
5 19 8 1 
6 20 9 2 
7 21 3 3 

또는 사용 카테고리

df['C']=df.groupby((df.A.diff()-1).fillna(0).cumsum()).B.apply(lambda x : x.astype('category').cat.codes+1).values 
df 
Out[110]: 
    A B C 
0 1 9 2 
1 2 8 1 
2 3 9 2 
3 14 7 2 
4 15 6 1 
5 19 8 2 
6 20 9 3 
7 21 3 1 

당신은 루프에 필요한 경우

for x,df1 in df.groupby((df.A.diff()-1).fillna(0).cumsum()): 

    print(df1.assign(C=pd.factorize(df1.B)[0]+1)) 


    A B C 
0 1 9 1 
1 2 8 2 
2 3 9 1 
    A B C 
3 14 7 1 
4 15 6 2 
    A B C 
5 19 8 1 
6 20 9 2 
7 21 3 3 
0

dataframe에 새 열을 추가합니다 withColumn 기능을 시도하고 당신이 인덱스 값을 할당 할 수 있습니다.

1

는 이제 해보자 :

df.columns = ['A','B'] 

g = df.groupby(df.A.diff().ne(1).cumsum()) 
df['C'] = g['B'].transform(lambda x: pd.factorize(x)[0] + 1) 

for n,g in g: 
    print(g) 

출력 :

A B C 
0 1 9 1 
1 2 8 2 
2 3 9 1 
    A B C 
3 14 7 1 
4 15 6 2 
    A B C 
5 19 8 1 
6 20 9 2 
7 21 3 3 
관련 문제