带有11列的pandas df需要使用正则表达式修改前3列并使用此修改后的列添加新列,并将此用于下游连接,类似这样我需要将元素保持为这些列的原因并使其成为唯一字符串
column1 column2 column3 column4 ...column 11
需要这样做new_col = column1:column2-column3(column4)
并制作这个新专栏,
column1 column2 column3 newcol column4 ...column 11
我可以使用简单的python一行来做到这一点,不知道pandas的语法是什么
l = cols[0] + ":" + cols[1] + "-" + cols[2] + "(" + cols[5] + ")"
答案 0 :(得分:3)
只要所有列都包含字符串,您应该能够使用您发布的相同语法来执行此操作。
您还可以使用Series.str.cat
方法。
df['new_col'] = cols[0].str.cat(':' + cols[1] + '-' + cols[2] + '(' + cols[5]+ ')')
答案 1 :(得分:2)
考虑数据框df
np.random.seed([3,1415])
df = pd.DataFrame(np.random.choice(a, (5, 10))).add_prefix('col ')
print(df)
col 0 col 1 col 2 col 3 col 4 col 5 col 6 col 7 col 8 col 9
0 Q L C K P X N L N T
1 I X A W Y M W A C A
2 U Z H T N S M E D T
3 N W H X N U F D X F
4 Z L Y H M G E H W S
构建自定义format
函数
f = lambda row: '{col 1}:{col 2}-{col 3}({col 4})'.format(**row)
并适用于df
df.astype(str).apply(f, 1)
0 L:C-K(P)
1 W:A-C(A)
2 W:H-X(N)
3 E:H-W(S)
4 Y:E-P(N)
dtype: object
使用assign
df.assign(New=df.astype(str).apply(f, 1))
# assign in place with
# df['New'] = df.astype(str).apply(f, 1)
col 0 col 1 col 2 col 3 col 4 col 5 col 6 col 7 col 8 col 9 New
0 Q L C K P X N L N T L:C-K(P)
1 I X A W Y M W A C A X:A-W(Y)
2 U Z H T N S M E D T Z:H-T(N)
3 N W H X N U F D X F W:H-X(N)
4 Z L Y H M G E H W S L:Y-H(M)
或者您可以将其包装到另一个在pd.Series
上运行的函数中。这要求您以正确的顺序传递列。
def u(a, b, c, d):
return a + ':' + b + '-' + c + '(' + d + ')'
df.assign(New=u(df['col 1'], df['col 2'], df['col 3'], df['col 4']))
# assign in place with
# df['New'] = u(df['col 1'], df['col 2'], df['col 3'], df['col 4'])
col 0 col 1 col 2 col 3 col 4 col 5 col 6 col 7 col 8 col 9 New
0 Q L C K P X N L N T L:C-K(P)
1 I X A W Y M W A C A X:A-W(Y)
2 U Z H T N S M E D T Z:H-T(N)
3 N W H X N U F D X F W:H-X(N)
4 Z L Y H M G E H W S L:Y-H(M)
答案 2 :(得分:1)
根据最近删除的答案,这很好用:
df1 = pd.DataFrame({
'chrom': ['a', 'b', 'c'],
'start': ['d', 'e', 'f'],
'end': ['g', 'h', 'i'],
'strand': ['j', 'k', 'l']}
)
df1['unique_col'] = df1.chrom + ':' + df1.start + '-' + df1.end + '(' + df1.strand + ')'
听起来您的原始数据框可能不包含字符串。如果它包含数字,你需要这样的东西:
df1 = pd.DataFrame({
'chrom': [1.0, 2.0],
'start': [3.0, 4.0],
'end': [5.0, 6.0],
'strand': [7.0, 8.0]}
)
df1['unique_col'] = (
df1.chrom.astype(str) + ':'
+ df1.start.astype(str) + '-' + df1.end.astype(str)
+ '(' + df1.strand.astype(str) + ')'
)