有點冗長的標題,但我有一個大型資料框,其中包含單個值或沒有值的串列。
import pandas as pd
data = {'Name': ['BN #1', 'HHC', 'A comp', 'B comp', BN #2', 'HHC', 'A comp', 'B comp'],
'SysNum': ['["1"]', [], [], [], '["2"]', [], [], []]
}
df = pd.DataFrame(data)
result =
Name SysNum
0 BN #1 ['1']
1 HHC []
2 A comp []
3 B comp []
4 BN #2 ['2']
5 HHC []
6 A comp []
7 B comp []
這是較大資料幀的一個小子集,其余是重復出現的 4 個相同選項,但 BN # 每次增加 1。有沒有辦法創建一個新列,從串列中取出“1”并將其轉換為整數?我嘗試了幾種不同的方法,但我沒有運氣。最終目標是有一列只有整數,所以我可以搜索最大值。
uj5u.com熱心網友回復:
因為您的某些資料是串列,[]而其中一些是串列的字串,所以'[]'您需要將所有內容轉換為字串,用于literal_eval將所有內容轉換為串列然后爆炸 - 假設每個串列中只有一個 int
import pandas as pd
from ast import literal_eval
data = {'Name': ['BN #1', 'HHC', 'A comp', 'B comp', 'BN #2', 'HHC', 'A comp', 'B comp'],
'SysNum': ['["1"]', [], [], [], '["2"]', [], [], []]
}
df = pd.DataFrame(data)
df['SysNum'] = df['SysNum'].astype(str).apply(literal_eval).explode().astype(float)
Name SysNum
0 BN #1 1.0
1 HHC NaN
2 A comp NaN
3 B comp NaN
4 BN #2 2.0
5 HHC NaN
6 A comp NaN
7 B comp NaN
uj5u.com熱心網友回復:
前兩個答案很好地描述了解決這個問題的方法。
如果需要,我的解決方案只是增加一些性能。
import numpy as np
df['result'] = 0
df.result = np.where(
len(df.SysNum)>0,
df.SysNum.str.strip('"[]'),
0
)
測驗
import pandas as pd
import time
data = {'Name': ['BN #1', 'HHC', 'A comp', 'B comp', 'BN #2', 'HHC', 'A comp', 'B comp']*100000,
'SysNum': ['["1"]', [], [], [], '["2"]', [], [], []]*100000
}
df = pd.DataFrame(data)
start = time.time()
import numpy as np
df['result'] = 0
df.result = np.where(
len(df.SysNum)>0,
df.SysNum.str.strip('"[]'),
0
)
print(time.time() - start)
# SeaBean
from ast import literal_eval
start = time.time()
df['res'] = df['SysNum'].astype(str).apply(literal_eval).explode().astype(float)
print(time.time() - start)
# It_is_Chris
start = time.time()
df['res1'] = df['SysNum'].astype('str').str.strip(r'\'"[]').map(lambda x: pd.to_numeric(x, errors='coerce')).ffill(downcast='infer')
print(time.time() - start)
在我的 Macbook Air M1 上給出(我希望這個結果與 Arm 無關,導致np.where通常最快的解決方案):
0.3059520721435547
2.994331121444702
4.511949062347412
uj5u.com熱心網友回復:
由于您的最終目標是從字串串列中提取每個數字并將其轉換為整數,而最終目標是有一列只有整數,您可以按如下方式進行:
df['SysNum'] = df['SysNum'].astype('str').str.strip(r'\'"[]').map(lambda x: pd.to_numeric(x, errors='coerce')).ffill(downcast='infer')
在這里,我們改變了列字串型別,然后洗掉的所有字符",',[和]使用.str.strip()。然后,利用pd.to_numeric將單個數字從字串轉換為整數型別。最后,我們將這些轉換后的整數用.ffill().
結果:
print(df)
Name SysNum
0 BN #1 1
1 HHC 1
2 A comp 1
3 B comp 1
4 BN #2 2
5 HHC 2
6 A comp 2
7 B comp 2
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/331164.html
下一篇:按字串向熊貓資料框添加顏色
