我的資料框有一列pairs包含一個 key-pair list。每個鍵在串列中都是唯一的。例如:
df = pd.DataFrame({
'id': ['1', '2', '3'],
'abc':None,
'pairs': [ ['abc/123', 'foo/345', 'xyz/789'], ['abc/456', 'foo/111', 'xyz/789'], ['xxx/222', 'foo/555', 'xyz/333'] ]
})
資料框是:
id | abc | pairs
------------------------------------
1 |None | [abc/123, foo/345, xyz/789]
2 |None | [abc/456, foo/111, xyz/789]
3 |None | [xxx/222, foo/555, xyz/333]
如果分割的元素 (idx=0)具有值 (key) =='abc' ,則該列abc將填充列中的值。pairs\
預期 df:
id | abc | pairs
------------------------------------
1 |123 | [abc/123, foo/345, xyz/789]
2 |456 | [abc/456, foo/111, xyz/789]
3 |None | [xxx/222, foo/555, xyz/333]
我尋找類似的東西:
df.loc[df['pairs'].map(lambda x: 'abc' in (l.split('/')[0] for l in x)), 'abc'] = 'FOUND'
我的問題是用正確的值替換FOUNDl.split('/')[0]
uj5u.com熱心網友回復:
您可以.str重復使用:
df['abc'] = df['pairs'].str[0].str.split('/').loc[lambda x: x.str[0] == 'abc'].str[1]
輸出:
>>> df
id abc pairs
0 1 123 [abc/123, foo/345, xyz/789]
1 2 456 [abc/456, foo/111, xyz/789]
2 3 NaN [xxx/222, foo/555, xyz/333]
更具可讀性的替代方案:
x = df['pairs'].str[0].str.split('/')
df.loc[x.str[0] == 'abc', 'abc'] = x.str[1]
uj5u.com熱心網友回復:
str.get盡可能多地使用;)
s = df['pairs'].str.get(0).str.split('/')
df['abc'] = np.where(s.str.get(0) == 'abc', s.str.get(1), None)
uj5u.com熱心網友回復:
試試看,你不需要也不需要applylambda 函式:
a = df['pairs'].str[0].str
df['abc'] = a.split('/').str[1].where(a.startswith('abc'))
輸出:
id abc pairs
0 1 123 [abc/123, foo/345, xyz/789]
1 2 456 [abc/456, foo/111, xyz/789]
2 3 NaN [xxx/222, foo/555, xyz/333]
注意:str[0] 等于使用 str.get(0)。

uj5u.com熱心網友回復:
“您可以反復使用 .str ” -> 是的,但是……它很慢!
在這種情況下,最好使用串列推導:
df['abc'] = [x[1] if (x:=l[0].split('/'))[0].startswith('abc') else float('nan')
for l in df['pairs']]
經驗法則:如果您需要 3 個str或更多,最好嘗試串列理解!
一張圖勝過千字:從 3 行到近 1M 行的性能測驗(所有當前答案):

獎金:在任何位置匹配第一個“abc”(不僅是第一個)
df['abc'] = [next((x.split('/')[1] for x in l if x.startswith('abc')), None)
for l in df['pairs']]
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/486559.html
