簡體   English   中英

將元組字符串轉換為元組列表

[英]Convert string of tuples to list of tuples

我正在使用 Pandas 讀取 CSV 文件並遇到解析問題,其中單引號被刪除,從而將字符串值更改為 Python 看到的未定義變量。 注意:我在這里沒有找到適用於我的問題的“將字符串轉換為列表”主題。

我有一個如下所示的 CSV 文件:

template_name,detect_time,no_chans,detect_val,detect_ratio,chans
2019_04_27t01_41_43,2018-05-04T12:18:09.633400Z,2,1.33368,0.666838109493,"('CHI', 'BHZ'), ('S14K', 'BHZ')"
2018_09_02t00_56_23,2018-05-10T16:40:33.508400Z,2,-1.34189,-0.670946359634,"('FALS', 'BHZ'), ('SDPT', 'BHZ')"

最后一列,命名為 chans 應作為元組列表讀取。 我正在用 Pandas 閱讀文件。 我已經使用pd.evalast.literal_eval轉換了列。 這兩個都去掉了內部單引號,所以我最終得到了一個變量名而不是一個字符串。

df = pd.read_csv(dfile, converters={'chans':ast.literal_eval})
df['chans']
0                               ((CHI, BHZ), (S14K, BHZ))
1                              ((FALS, BHZ), (SDPT, BHZ))

使用 pd.eval 的結果幾乎相同,但它轉換為列表列表:

0                               [[CHI, BHZ], [S14K, BHZ]]
1                              [[FALS, BHZ], [SDPT, BHZ]]

字符串周圍的單引號已被刪除,現在 Python 將(CHI, BHZ)解釋為兩個未定義變量的元組。

如果我不使用任何轉換器pd.read_csv(dfile) ,我會得到這樣的字符串:

0                         ('CHI', 'BHZ'), ('S14K', 'BHZ')
1                        ('FALS', 'BHZ'), ('SDPT', 'BHZ')

我想我可以處理它以獲得我想要的東西——每行的元組列表——但是有更好的方法嗎?

您可以使用list(eval)作為轉換器來使用 lambda:

df = pd.read_csv(dfile, converters={'chans':lambda x:list(eval(x))})

這將為您提供一個元組列表,而不僅僅是一個字符串。

我找到了一個簡單的解決方案:備受詬病的 Python 函數eval 由於太多警告,我忽略了這種可能性:速度慢且不安全。 但安全對我來說不是問題, eval可以勝任。 但是eval只能在 Python 中正常工作,而不能在 Pandas 中正常工作。 所以我的代碼有點難看:

df = pd.read_csv(dfile)
for index,row in df.iterrows():
    row['chans'] = eval(row['chans'])

這些其他“解決方案”不起作用,因為它們去掉了單引號:

df = pd.read_csv(dfile)
df['chans'] = df['chans'].apply(eval)

或者:

df = pd.read_csv(dfile, converters={'chans':eval})

很遺憾我必須使用iterrows

我很想知道其他解決方案。 由於我不在乎字符串是否被解釋為元組或列表,因此涉及 json 似乎是一種可能性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM