2017-10-19 2 views
2

나는 누구의 행입니다dataframe의 열을 연결하고 생성 새로운 ID

A_1 
A_2 
etc. 
A_10 
B_1 
C_1 
C_2 
etc. 
D_124 
D_125 
E_1 

내가 df['Hit_ID'] = df[['City','hits']].apply(lambda x:'_'.join(x.astype(str)),axis=1)하지만 시도 Hit_ID라는 단일 컬럼으로 dataframe을하려는 dataframe에게

City hits 
A  10 
B  1 
C  22 
D  122 
E  1 
F  165 

이 이것은 단지 열을 연결합니다. 적용 함수를 수정하여 원하는 연산을 얻으려면 어떻게해야합니까?

답변

4

당신이 필요합니다

#repeat index values by column hits 
df = df.loc[df.index.repeat(df['hits'])].reset_index(drop=True) 
#create counts 
df['hits'] = df.groupby('City').cumcount() + 1 
#concatenate columns 
df['Hit_ID'] = df['City'] + '_' + df['hits'].astype(str) 
print (df.head(20)) 
    City hits Hit_ID 
0  A  1 A_1 
1  A  2 A_2 
2  A  3 A_3 
3  A  4 A_4 
4  A  5 A_5 
5  A  6 A_6 
6  A  7 A_7 
7  A  8 A_8 
8  A  9 A_9 
9  A 10 A_10 
10 B  1 B_1 
11 C  1 C_1 
12 C  2 C_2 
13 C  3 C_3 
14 C  4 C_4 
15 C  5 C_5 
16 C  6 C_6 
17 C  7 C_7 
18 C  8 C_8 
19 C  9 C_9 
+0

이것은 원하는 출력이 아닙니다. 도시 A의 행 수는 조회수와 같아야합니다. 즉 행은 A_1, A_2, A_3, A_4, A_5, A_6, A_7, A_8, A_9, A_10 등이어야합니다. – Ssank

+0

죄송합니다. 이제 솔루션이 변경되었습니다. – jezrael

+0

이 솔루션에는 실제로 원하는 결과를주지 않는 작은 버그가 있습니다. 카운터를 만들 때 조회수가 아닌 도시별로 '그룹화'해야합니다. OP City * B *와 * E *에는 B_1과 E_2와 같은 수의 히트 수가있었습니다. 그리고 문자열을 합치려면'df [ 'Hit_ID'] = df.astype (str) .apply ("_"join, axis = 1)'조금 짧습니다;) –

0

이 시도 : 정수의 열에서

df['hits'] = df.hits.transform(lambda x: range(1, x)) 
s = df.apply(lambda x: pd.Series(x['hits']),axis=1).stack().reset_index(level=1, drop=True) 
s.name = 'hits' 
df = pd.concat([df.City, s], axis=1) 
df['hit_id'] = df.City + '_' + df.hits.astype(str) 
  • 변경 df.hits을 목록의 열, 1 원래 값에 이르기까지.
  • 목록의 열을 일련의 행으로 확장하려면 @RomanPekar가 설명한 here 기술을 사용하십시오.
  • 새 열을 원래 df.City 열과 연결하십시오.
  • _과 함께 두 열을 결합하십시오.
관련 문제