Câu hỏi này đã được trả lời, nhưng tôi tin rằng sẽ rất tốt nếu đưa một số phương pháp hữu ích chưa được thảo luận trước đây vào hỗn hợp và so sánh tất cả các phương pháp được đề xuất cho đến nay về hiệu suất.
Dưới đây là một số giải pháp hữu ích cho vấn đề này, theo thứ tự hiệu suất ngày càng tăng.
Đây là một str.format
cách tiếp cận dựa trên cơ sở đơn giản .
df['baz'] = df.agg('{0[bar]} is {0[foo]}'.format, axis=1)
df
foo bar baz
0 a 1 1 is a
1 b 2 2 is b
2 c 3 3 is c
Bạn cũng có thể sử dụng định dạng chuỗi f tại đây:
df['baz'] = df.agg(lambda x: f"{x['bar']} is {x['foo']}", axis=1)
df
foo bar baz
0 a 1 1 is a
1 b 2 2 is b
2 c 3 3 is c
Chuyển đổi các cột để nối thành chararrays
, sau đó thêm chúng lại với nhau.
a = np.char.array(df['bar'].values)
b = np.char.array(df['foo'].values)
df['baz'] = (a + b' is ' + b).astype(str)
df
foo bar baz
0 a 1 1 is a
1 b 2 2 is b
2 c 3 3 is c
Tôi không thể nói quá mức độ hiểu của danh sách được đánh giá thấp ở gấu trúc.
df['baz'] = [str(x) + ' is ' + y for x, y in zip(df['bar'], df['foo'])]
Ngoài ra, sử dụng str.join
để nối (cũng sẽ chia tỷ lệ tốt hơn):
df['baz'] = [
' '.join([str(x), 'is', y]) for x, y in zip(df['bar'], df['foo'])]
df
foo bar baz
0 a 1 1 is a
1 b 2 2 is b
2 c 3 3 is c
Khả năng hiểu danh sách vượt trội trong thao tác chuỗi, bởi vì các hoạt động chuỗi vốn đã khó được vectơ hóa và hầu hết các hàm "vectorised" của gấu trúc về cơ bản là trình bao bọc xung quanh các vòng lặp. Tôi đã viết nhiều về chủ đề này trong vòng lặp Đối với gấu trúc - Khi nào tôi nên quan tâm? . Nói chung, nếu bạn không phải lo lắng về việc căn chỉnh chỉ mục, hãy sử dụng khả năng hiểu danh sách khi xử lý các phép toán chuỗi và regex.
Danh sách bên trên theo mặc định không xử lý NaN. Tuy nhiên, bạn luôn có thể viết một hàm bao bọc một lần thử ngoại trừ nếu bạn cần xử lý nó.
def try_concat(x, y):
try:
return str(x) + ' is ' + y
except (ValueError, TypeError):
return np.nan
df['baz'] = [try_concat(x, y) for x, y in zip(df['bar'], df['foo'])]
perfplot
Đo lường hiệu suất
Biểu đồ được tạo bằng perfplot . Đây là danh sách mã hoàn chỉnh .
Chức năng
def brenbarn(df):
return df.assign(baz=df.bar.map(str) + " is " + df.foo)
def danielvelkov(df):
return df.assign(baz=df.apply(
lambda x:'%s is %s' % (x['bar'],x['foo']),axis=1))
def chrimuelle(df):
return df.assign(
baz=df['bar'].astype(str).str.cat(df['foo'].values, sep=' is '))
def vladimiryashin(df):
return df.assign(baz=df.astype(str).apply(lambda x: ' is '.join(x), axis=1))
def erickfis(df):
return df.assign(
baz=df.apply(lambda x: f"{x['bar']} is {x['foo']}", axis=1))
def cs1_format(df):
return df.assign(baz=df.agg('{0[bar]} is {0[foo]}'.format, axis=1))
def cs1_fstrings(df):
return df.assign(baz=df.agg(lambda x: f"{x['bar']} is {x['foo']}", axis=1))
def cs2(df):
a = np.char.array(df['bar'].values)
b = np.char.array(df['foo'].values)
return df.assign(baz=(a + b' is ' + b).astype(str))
def cs3(df):
return df.assign(
baz=[str(x) + ' is ' + y for x, y in zip(df['bar'], df['foo'])])