【问题标题】:Dictionary into DataFrame字典到 DataFrame
【发布时间】:2018-02-01 22:44:20
【问题描述】:

我正在将 dict 转换为数据框:

states = {'OH': 'Ohio', 'KY': 'Kentucky', 'AS': 'American Samoa', 'NV': 'Nevada', 'WY': 'Wyoming', 'NA': 'National', 'AL': 'Alabama', 'MD': 'Maryland', 'AK': 'Alaska', 'UT': 'Utah', 'OR': 'Oregon', 'MT': 'Montana', 'IL': 'Illinois', 'TN': 'Tennessee', 'DC': 'District of Columbia', 'VT': 'Vermont', 'ID': 'Idaho', 'AR': 'Arkansas', 'ME': 'Maine', 'WA': 'Washington', 'HI': 'Hawaii', 'WI': 'Wisconsin', 'MI': 'Michigan', 'IN': 'Indiana', 'NJ': 'New Jersey', 'AZ': 'Arizona', 'GU': 'Guam', 'MS': 'Mississippi', 'PR': 'Puerto Rico', 'NC': 'North Carolina', 'TX': 'Texas', 'SD': 'South Dakota', 'MP': 'Northern Mariana Islands', 'IA': 'Iowa', 'MO': 'Missouri', 'CT': 'Connecticut', 'WV': 'West Virginia', 'SC': 'South Carolina', 'LA': 'Louisiana', 'KS': 'Kansas', 'NY': 'New York', 'NE': 'Nebraska', 'OK': 'Oklahoma', 'FL': 'Florida', 'CA': 'California', 'CO': 'Colorado', 'PA': 'Pennsylvania', 'DE': 'Delaware', 'NM': 'New Mexico', 'RI': 'Rhode Island', 'MN': 'Minnesota', 'VI': 'Virgin Islands', 'NH': 'New Hampshire', 'MA': 'Massachusetts', 'GA': 'Georgia', 'ND': 'North Dakota', 'VA': 'Virginia'}

myStates = pd.DataFrame(states.items(), columns=['a','b'])

Jupyter Notebook 抛出以下错误:

     13 
---> 14     myStates = pd.DataFrame(states.items(), columns=['a','b'])

PandasError: DataFrame constructor not properly called!

但我在 PyCharm/Python2.7 上没有收到任何错误,输出如下:

     a                         b 
 0   WA                Washington
 1   WI                 Wisconsin
 2   WV             West Virginia
 3   FL                   Florida
 4   WY                   Wyoming
 5   NH             New Hampshire

还有其他解决方法吗?

谢谢, P

【问题讨论】:

  • 假设会导致什么样的DataFrameab 列是什么?这个dict 看起来应该是一个pd.Seriesmy_states = pd.Series(states)

标签: python pandas dictionary dataframe jupyter


【解决方案1】:

pd.DataFrame.from_dict 可能是您需要的。

myStates = pd.DataFrame.from_dict(states, orient='index').reset_index()
myStates.columns = ['a', 'b']

myStates.head(5)

#     a               b
# 0  OH            Ohio
# 1  KY        Kentucky
# 2  AS  American Samoa
# 3  NV          Nevada
# 4  WY         Wyoming

【讨论】:

  • 那行得通。我的方法有什么问题,为什么它不是在 PyCharm 中而是在 Jupyter 中引发错误?
  • @Peter,请参阅 Alex 对 PyCharm vs Jupyter 的回答。看起来像不同的python版本。
【解决方案2】:

您在 Jupyter 中使用 Python3,在 PyCharm 中使用 Python2。 Python2 dict.items 返回 list 而 Python3 dict.items 返回 generator dictionary view object(感谢@juanpa.arrivillaga 的更正)。 a SO answer 提供了更多细节,但总的来说这是为了节省内存并加快计算时间。

Here is a reference2to3 文档,该文档明确指出 Python2 中的 dict.items() 在逻辑上等同于 Python3 中的 list(dict.items())

所以你需要做的就是在 Python3 中运行时调用 list 构造函数:

myStates = pd.DataFrame(list(states.items()), columns=['a','b'])

您可以使用sys 动态检查您正在运行的python 版本:

import sys
print(sys.version)  # '3.6.3 ...'

注意:请参阅@jp_data_analysis 答案以了解如何以与版本无关的方式处理此问题。

【讨论】:

  • nitpick:dict.items 不返回生成器,哎呀,它甚至不返回迭代器。它返回一个可迭代的 view.
【解决方案3】:

通过使用Series

pd.Series(states).to_frame('State').head()
Out[471]: 
             State
AK          Alaska
AL         Alabama
AR        Arkansas
AS  American Samoa
AZ         Arizona

【讨论】:

    猜你喜欢
    • 2016-11-19
    • 2022-01-01
    • 2019-07-24
    • 1970-01-01
    • 1970-01-01
    • 2020-10-22
    • 2022-01-20
    • 2018-02-28
    • 2018-08-13
    相关资源
    最近更新 更多