2017-10-21 128 views
3

我有一個csv文件,它有很多列。一列包含字典對象形式的數據以及字符串。例如:列包含以下數據:{「a」:5,「b」:6,「c」:8},「usa」,「india」,{「a」:9,「b」 :10,「C」:11}字典對象轉換爲字符串從csv讀取數據時熊貓python

當我使用閱讀本CSV成數據幀:

df = pd.read_csv(path) 

該列的數據被識別爲字符串當我沒有df.applymap(type) 檢查每個類型元素存儲在這個特定的列中。

但是數據在csv和數據框中都沒有引號。但仍然字典對象轉換爲字符串並存儲在數據框中。

在檢查列的類型時,它變成了對象。

請建議如何從csv讀入數據框,以便dict對象在此特定列中被識別爲dict和字符串作爲字符串。

+1

這就是熊貓如何表示複雜的數據類型。 –

+0

@cᴏʟᴅsᴘᴇᴇᴅ這來自一個較早的問題,其中條目恰好是字符串而不是字典。我想這個可能突出顯示的微妙差別是「a」而不是「a」! –

+1

@AndyHayden是的,我剛剛看到。感謝你豐富的答案,我從他們身上學到了很多。 –

回答

3

可以轉換,應該是使用literal_eval類型的字典(或其他類型)的字符串:

from ast import literal_eval 

def try_literal_eval(s): 
    try: 
     return literal_eval(s) 
    except ValueError: 
     return s 

現在,您可以將此到您的數據幀:

In [11]: df = pd.DataFrame({'A': ["hello","world",'{"a":5,"b":6,"c":8}',"usa","india",'{"d":9,"e":10,"f":11}']}) 

In [12]: df.loc[2, "A"] 
Out[12]: '{"a":5,"b":6,"c":8}' 

In [13]: df 
Out[13]: 
         A 
0     hello 
1     world 
2 {"a":5,"b":6,"c":8} 
3     usa 
4     india 
5 {"d":9,"e":10,"f":11} 


In [14]: df.applymap(try_literal_eval) 
Out[14]: 
          A 
0      hello 
1      world 
2 {'a': 5, 'b': 6, 'c': 8} 
3       usa 
4      india 
5 {'d': 9, 'e': 10, 'f': 11} 

In [15]: df.applymap(try_literal_eval).loc[2, "A"] 
Out[15]: {'a': 5, 'b': 6, 'c': 8} 

注:這是相當昂貴(在時間上)就其他調用而言,但是當你在處理DataFrames/Series中的字典時,你必須默認回到python對象,所以事情會比較慢......這可能是一個好主意反規範化即將數據返回爲列e。 G。使用json_normalize

+0

我猜json_normalize的建議有點不必要,因爲你來自這個問題https://stackoverflow.com/a/46856679/1240268 –

+0

我需要刪除所有字符串行並將dict對象轉換爲列。所以,這個轉換需要使用json_normalize。如上所述,我在數據框中有許多列,但我想要在特定列上應用地圖事物,我如何在此代碼中執行'df.applymap(try_literal_eval)'。像指定我的列名 –

+1

@NikitaGupta例如'df.A.apply(try_literal_eval)' –