我有大型 csv 資料檔案,其中包含幾列混合資料型別、整數和帶數學運算子的字串。例如。
column1 column2
70 90
60 3 50
80 30-4
90 5 40 7
45-4 60
50 5 56
50-5 32 20
無論如何在熊貓資料框中我只能將列值讀取為整數嗎?我想讀取字串值作為操作的輸出。
期望的輸出應該是,
column1 column2
70 90
63 50
80 26
95 47
41 60
55 56
45 52
提前致謝!DP
uj5u.com熱心網友回復:
(擴展我的評論......)
您將需要評估這些運算式。
雖然eval()能夠做到這一點,但它也能夠評估任何任意 Python 代碼,包括會竊取您的秘密、破壞您的系統等的東西。
因此,您需要確保那里沒有任何不妥之處;下面,我使用正則運算式來確保字串中的所有字符都是數字或基本數學運算子之一。(eval()由于無效的語法,呼叫仍然可能失敗,例如3*/3,或者可能需要很長時間或導致一個很大的值 ( 333**999)。)
例如,data此處是獨立的,但您自然可以從檔案或其他內容中讀取它。
import io
import re
import pandas as pd
CSV_DATA = """
column1;column2
70;90
60 3;50
80;30-4
90 5;40 7
45-4;60
50 5;56
50-5;32 20
""".strip()
safe_re = re.compile("^[- */0-9] $")
data = pd.read_csv(io.StringIO(CSV_DATA), sep=";")
def maybe_evaluate(val):
if isinstance(val, str):
if val.isdigit():
# already only numbers, coerce to integer
return int(val)
if safe_re.match(val):
# should be safe to evaluate (only numbers and operators)
return eval(val)
# Otherwise, return the value as-is (you could raise an error here)
return val
data["column1"] = data["column1"].apply(maybe_evaluate)
data["column2"] = data["column2"].apply(maybe_evaluate)
print(data)
這列印出來
column1 column2
0 70 90
1 63 50
2 80 26
3 95 47
4 41 60
5 55 56
6 45 52
正如預期的那樣。
uj5u.com熱心網友回復:
除了eval我們自己實作安全之外,我們還可以利用pandas已經提供了這樣的實作的優勢:
import pandas as pd
df = pd.DataFrame({
'column1': ['70', '60 3', '80', '90 5', '45-4', '50 5', '50-5'],
'column2': ['90', '50', '30-4', '40 7', '60', '56', '32 20']
})
for col in df.columns:
df[col] = pd.eval(df[col])
或與apply:
df = df.apply(pd.eval)
要么產生df:
column1 column2
0 70 90
1 63 50
2 80 26
3 95 47
4 41 60
5 55 56
6 45 52
pandas.eval 將要:
使用各種后端將 Python 運算式計算為字串。
支持以下算術運算: 、-、*、/、**、%、//(僅限 Python 引擎)以及以下布爾運算: | (or), & (and), and ~ (not)。此外,“pandas”決議器允許使用和、或、和與相應的按位運算子不同的語意。支持 Series 和 DataFrame 物件,其行為與普通的 Python 評估一樣。
“字串不能包含任何 Python陳述句,只能包含Python 運算式。”
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/331601.html
