连接数据框中的列并生成新ID

时间:2017-10-19 15:01:20

标签: python pandas

我有一个数据框

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

我想创建一个名为Hit_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)但这只是连接列。如何修改apply函数以获得所需的op?

2 个答案:

答案 0 :(得分: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

答案 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列连接。
  • 使用_加入两列。