我正在嘗試使用 Pandas 連接多個列,并將分隔符定義到另一列中。我面臨的問題是避免使用空白單元格的分隔符。
下面給出了我嘗試的示例代碼和解釋問題的輸出:
import pandas as pd
df = pd.DataFrame({'col_1': ['', '1', '1', '2', '2', '3', '3', '4', '', '4', '5', '5', '5', '5', '5', '5'],
'col_2': ['A', '', 'C', 'A', '', 'C', 'D', 'D', 'A', 'A', 'B', 'E', 'F', 'G', 'H', 'I'],
'col_3': ['256', '546', '985', '573', '265', '731', '968', '592', '364', '', '953', '476', '835',
'', '572', '903'],
'col_4': ['.', '.', '.', '-', '_', '_', '-', '.', '.', '/', '/', '.', '_', '_', '-', '.']})
df['concatenated'] = df['col_1'] df['col_4'] df['col_2'] df['col_4'] df['col_3']
print(df)
我得到的輸出是:
col_1 col_2 col_3 col_4 concatenated
0 A 256 . .A.256
1 1 546 . 1..546
2 1 C 985 . 1.C.985
3 2 A 573 - 2-A-573
4 2 265 _ 2__265
5 3 C 731 _ 3_C_731
6 3 D 968 - 3-D-968
7 4 D 592 . 4.D.592
8 A 364 . .A.364
9 4 A / 4/A/
10 5 B 953 / 5/B/953
11 5 E 476 . 5.E.476
12 5 F 835 _ 5_F_835
13 5 G _ 5_G_
14 5 H 572 - 5-H-572
15 5 I 903 . 5.I.903
但預期的輸出是:
col_1 col_2 col_3 col_4 concatenated
0 A 256 . A.256
1 1 546 . 1.546
2 1 C 985 . 1.C.985
3 2 A 573 - 2-A-573
4 2 265 _ 2_265
5 3 C 731 _ 3_C_731
6 3 D 968 - 3-D-968
7 4 D 592 . 4.D.592
8 A 364 . A.364
9 4 A / 4/A
10 5 B 953 / 5/B/953
11 5 E 476 . 5.E.476
12 5 F 835 _ 5_F_835
13 5 G _ 5_G
14 5 H 572 - 5-H-572
15 5 I 903 . 5.I.903
實際資料包含更多列,但我只需要加入選擇性列。
任何人都可以幫助我找到解決方案或指導我朝著正確的方向前進嗎?
uj5u.com熱心網友回復:
您可以使用str.strip()洗掉兩端多余的分隔符,也str.replace()可以洗掉重復的連續分隔符,如下所示:
import re
sep = list(map(re.escape, df['col_4'].unique()))
sep_regex = '|'.join(sep)
df['concatenated'] = (df['concatenated'].str.strip(sep_regex)
.str.replace(fr'({sep_regex})\1', r'\1', regex=True)
)
結果:
print(df)
col_1 col_2 col_3 col_4 concatenated
0 A 256 . A.256
1 1 546 . 1.546
2 1 C 985 . 1.C.985
3 2 A 573 - 2-A-573
4 2 265 _ 2_265
5 3 C 731 _ 3_C_731
6 3 D 968 - 3-D-968
7 4 D 592 . 4.D.592
8 A 364 . A.364
9 4 A / 4/A
10 5 B 953 / 5/B/953
11 5 E 476 . 5.E.476
12 5 F 835 _ 5_F_835
13 5 G _ 5_G
14 5 H 572 - 5-H-572
15 5 I 903 . 5.I.903
解釋:
在這里,我們創建了一個唯一符號串列,col_4如果這些字符是正則運算式元字符,我們將使用re.escape.
print(sep)
['\\.', '\\-', '_', '/']
此外,為了與str.strip()and 中的這些字符匹配str.replace(),我們進一步制作了一個正則運算式,列出了這些可能的替代方案:
這些是|上面那些轉義分隔符的(即“或”):
print(sep_regex)
'\\.|\\-|_|/'
我們使用正則運算式反向參考\1來檢測重復的連續字符并將它們替換為這些字符的單次出現。
uj5u.com熱心網友回復:
解決方案(假設df沒有concatenated列)
df.apply(lambda row: row[-1].join([x for x in row[:-1] if x != '']), axis=1)
這是通過對每一行應用一個函式來實作的,該函式獲取最后一個元素,并在呼叫string join 時將其用作分隔符,連接除最后一個元素之外的所有元素,這些元素不等于“”。
uj5u.com熱心網友回復:
此解決方案可能適合您:
df['concat'] = ''
for row in df.iterrows():
index = row[0]
values = row[1]
vals = [x for x in values if x != '']
df.loc[index, 'concat'] = (vals[-1].join(vals[:-1]))
df
結果:
col_1 col_2 col_3 col_4 concat
0 A 256 . A.256
1 1 546 . 1.546
2 1 C 985 . 1.C.985
3 2 A 573 - 2-A-573
4 2 265 _ 2_265
5 3 C 731 _ 3_C_731
6 3 D 968 - 3-D-968
7 4 D 592 . 4.D.592
8 A 364 . A.364
9 4 A / 4/A
10 5 B 953 / 5/B/953
11 5 E 476 . 5.E.476
12 5 F 835 _ 5_F_835
13 5 G _ 5_G
14 5 H 572 - 5-H-572
15 5 I 903 . 5.I.903
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/336103.html
上一篇:如何剝離列并合并?
