2014-03-26 51 views
1

使用records = pandas.read_json(path)將JSON文檔導入到熊貓數據框中,其中path是JSON文檔的預定義路徑,我發現結果數據框「records」的某些列的內容不是預期的簡單字符串。相反,這樣的列中的每個「單元格」都是一個數組,其中包含一個單一元素 - 感興趣的字符串。這使得使用布爾索引來選擇列變得困難。例如,Ipython中的records[records['category']=='Python Books']輸出一個空的數據框; 「單元格」包含字符串而不是字符串數組,輸出將是非空的,包含對應於Python書籍的行。我有單元素數組。我如何將它們自己更改爲元素?

我可以修改JSON文檔,以便「記錄」正確讀取字符串。但是有沒有辦法直接修改「記錄」,以某種方式將單元素數組自己剝離成元素?

+0

聽起來? http://pandas.pydata.org/pandas-docs/stable/io.html#normalization(將有助於舉一個實際的例子:) :) –

+0

謝謝安迪。我沒有嘗試json本身的規範化,但看起來我可以這樣做來解決問題。我會爲我的下一個json輸出嘗試。 – MichM

回答

1

更新:澄清之後,我相信這可能實現你想要的東西,而它限制在單一數據迭代:

nested_column_1 = records["column_name_1"] 
nested_column_2 = records["column_name_2"] 

clean_column_1 = [] 
clean_column_2 = [] 

for i in range(0, len(records.index): 
    clean_column_1.append(nested_column_1[i][0]) 
    clean_column_2.append(nested_column_2[i][0]) 

然後將轉換爲clean_column名單系列像你提到你評論。顯然,你可以根據需要創建儘可能多的nested_column和clean_column列表,並在循環中更新它們。

通過保留「問題」列的記錄並使用它來創建數據結構來管理嵌套/清理列表,而不是像我在示例中那樣顯式聲明它們,可以很容易地推廣這一點。但我認爲這可能會更清楚地說明這種方法。

顯然,這假設所有列都有相同數量的元素,這可能不是您的情況下的有效斷言。

原來的答案:

很抱歉,如果我過於簡單化和誤解的問題,但你可能只是做這樣的事情?

simplified_list = [element[0] for element in my_array_of_arrays] 

或者,如果你不需要整個事情一次,而不是僅僅一個發電機:像你這樣做歸一化

simplifying_generator = (element[0] for element in my_array_of_arrays) 
+0

好的謝謝。我能做 'cat2 = [元素[0]爲記錄中的元素['cat']]' 'records ['cat2'] = Series(cat2,index = records.index)' 我可以然後刪除原來的「貓」列,將cat2重新命名爲cat,並且會很好。 但是,我仍然懷疑是否有更快的方法來做到這一點,如果我有多列這種問題,我不想遍歷所有這些列。 – MichM

+0

啊,我想我明白了。您可以通過切出所有具有嵌套數組的列來進行單次迭代,然後只迭代一次,更新每個循環中的所有列。我會舉一個我在回答中建議的例子。 – Nacho

+0

我感謝你的幫助納喬。 – MichM

相關問題