在我的資料框中:
no pre_code
1 23, 234, 345
2 234, 345
3 23
4 NaN
我想計算pre_code列內的字串數,到目前為止我嘗試過的是:
df['count'] = df['pre_code'].astype('str').str.split(',').str.len().fillna(0)
但是使用上面的代碼,它將 NaN 計為 1。所以,我沒有得到想要的結果。
之前,我也試過這種方式:
df['count'] = df['pre_code'].str.count(',').add(1).fillna(0)
不幸的是,上面的代碼也不適用于我的資料幀。它為單個條目字串提供了 0。供您參考,我的資料框中有 2200 行,不知何故,代碼無法完美地處理這些行數。當我只嘗試 5 行時,不知何故它運行良好。
我希望結果是這樣的:
no pre_code count
1 23, 234, 345 3
2 234, 345 2
3 23 1
4 NaN 0
我的情況有什么解決方案嗎?
提前致謝。
uj5u.com熱心網友回復:
我認為你需要nanlikenp.nan而不是 string nan,那么兩種解決方案都可以正常作業:
您需要測驗沒有替換數字的值的外觀:
print (df.loc[~df['pre_code'].str.contains('\d'), 'pre_code'].unique().tolist())
['nan']
df['count'] = df['pre_code'].replace('nan', np.nan).str.split(',').str.len().fillna(0)
或者:
df['count'] = df['pre_code'].replace('nan', np.nan).str.count(',').add(1).fillna(0)
print (df)
no pre_code count
0 1 23, 234, 345 3.0
1 2 234, 345 2.0
2 3 23 1.0
3 4 NaN 0.0
編輯:
編輯:更一般的解決辦法是沒有數字轉換值NaN在Series.where與Series.str.contains:
df['count'] = (df['pre_code'].where(df['pre_code'].str.contains('\d', na=False))
.str.count(',')
.add(1)
.fillna(0)
.astype(int))
print (df)
no pre_code count
0 1 23, 234, 345 3
1 2 234, 345 2
2 3 23 1
3 4 NaN 0
uj5u.com熱心網友回復:
嘗試:
df['count'] = df.loc[df['pre_code'].notna(), 'pre_code'] \
.astype(str).str.split(',').str.len() \
.reindex(df.index, fill_value=0)
print(df)
# Output:
no pre_code count
0 1 23, 234, 345 3
1 2 234, 345 2
2 3 23 1
3 4 NaN 0
我不確定您是否必須轉換為 str (`astype(str))。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/334528.html
