在示例 DataFrame 中,為什么空串列的長度為 1?我希望一個空串列的長度為 0;作為len([]) == 0.
用例:
我正在嘗試計算每行中的值的數量,其中值是一串逗號分隔的整數或字母數字。
例子:
創建示例資料集:
import pandas as pd
df = pd.DataFrame({'col1': ['1,2,3,4', '1,2,3', '1,2', '1A, 363C',
'1,1-33', '26a, Green House', '** All **', '', '']})
df['col1']
0 1,2,3,4
1 1,2,3
2 1,2
3 1A, 363C
4 1,1-33
5 26a, Green House
6 ** All **
7
8
Name: col1, dtype: object
用逗號分割字串以創建值串列:
df['col1'].str.split(',')
0 [1, 2, 3, 4]
1 [1, 2, 3]
2 [1, 2]
3 [1A, 363C]
4 [1, 1-33]
5 [26a, Green House]
6 [** All **]
7 []
8 []
Name: col1, dtype: object
嘗試確定每個串列的長度:
df['col1'].str.split(',').map(len)
0 4
1 3
2 2
3 2
4 2
5 2
6 1
7 1 <-- Expedted to be 0
8 1 <-- Expected to be 0
Name: col1, dtype: int64
問題:
- 為什么空串列的長度為 1?
- 正如@Timus 所指出的,使用
.map(repr)顯示串列不是空的:['']。謝謝你。
- 正如@Timus 所指出的,使用
- 對于這個用例,什么是更好的方法?
uj5u.com熱心網友回復:
我們可以嘗試str.count
df['count'] = df['col1'].str.count(r'[^,] ')
col1 count
0 1,2,3,4 4
1 1,2,3 3
2 1,2 2
3 1A 1
4 0
uj5u.com熱心網友回復:
最后一個有空字串。
>>> ''.split(',')
['']
uj5u.com熱心網友回復:
如果要將空字串計為 0,則可以屏蔽它們:
df['col1'].str.split(',').str.len().mask(df['col1'].eq(''),0)
但是請注意,split len并不是最直接的方法。您可以只計算分隔符 ( ,)。然后在字串不為空的地方加 1:
df['col1'].str.count(',').add(df['col1'].ne(''))
輸出:
0 4
1 3
2 2
3 1
4 0
Name: col1, dtype: int64
uj5u.com熱心網友回復:
感謝@Timus 提供的洞察力,用于.map(repr)將非空串列顯示為[''].
解決方案:
將所有空字串值替換為NaN:
df['col1'].replace('', float('nan'), inplace=True)
如果值不是 a ,則應用 lambda 陳述句進行拆分和計數float:
df['count'] = df['col1'].apply(lambda x: len(x.split(',')) if not isinstance(x, float) else 0)
結果:
col1 count
0 1,2,3,4 4
1 1,2,3 3
2 1,2 2
3 1A 1
4 NaN 0
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/453153.html
標籤:Python python-3.x 熊猫
