【问题标题】:How can I change this form of dictionary to pandas dataframe?如何将这种形式的字典更改为 pandas 数据框?
【发布时间】:2018-05-08 11:38:33
【问题描述】:

我现在正在使用 python pandas 模块处理推文数据, 我坚持这个问题。

我想从这个字典中制作一个频率表(熊猫数据框):

d = {"Nigeria": 9, "India": 18, "Saudi Arabia": 9, "Japan": 60, "Brazil": 3, "United States": 38, "Spain": 5, "Russia": 3, "Ukraine": 3, "Azerbaijan": 5, "China": 1, "Germany": 3, "France": 12, "Philippines": 8, "Thailand": 5, "Argentina": 9, "Indonesia": 3, "Netherlands": 8, "Turkey": 2, "Mexico": 9, "Italy": 2}

想要的输出是:

>>> import pandas as pd
>>> df = pd.DataFrame(?????)
>>> df

Country      Count
Nigeria      9
India        18
Saudi Arabia 9
.
.
.

(不管最左列是否有从0到n的索引)

谁能帮我解决这个问题? 提前谢谢!

【问题讨论】:

    标签: python pandas dictionary dataframe


    【解决方案1】:

    你只有一个系列(一列具有索引值的数据),真的,所以这行得通:

    pd.Series(d, name='Count')
    

    然后,您可以根据需要构造一个 DataFrame:

    df = pd.DataFrame(pd.Series(d, name='Count'))
    df.index.name = 'Country'
    

    现在你有:

                   Count
    Country             
    Argentina          9
    Azerbaijan         5
    Brazil             3
    ...
    

    【讨论】:

    • 我同意你为什么说高效,没有想到 pd.Series
    • 太棒了!被你的知识感动!谢谢!
    • @John Zwinck 还有pd.Series(d, name='Count').to_frame() 只是另一种表示方式
    【解决方案2】:

    使用DataFrame 构造函数并将valueskeys 分别传递给列:

    df = pd.DataFrame({'Country':list(d.keys()), 
                       'Count': list(d.values())}, columns=['Country','Count'])
    print (df)
              Country  Count
    0      Azerbaijan      5
    1       Indonesia      3
    2         Germany      3
    3          France     12
    4          Mexico      9
    5           Italy      2
    6           Spain      5
    7          Brazil      3
    8        Thailand      5
    9       Argentina      9
    10        Ukraine      3
    11  United States     38
    12         Turkey      2
    13        Nigeria      9
    14   Saudi Arabia      9
    15    Philippines      8
    16          China      1
    17          Japan     60
    18         Russia      3
    19          India     18
    20    Netherlands      8
    

    【讨论】:

      【解决方案3】:

      将其作为列表传递

      pd.DataFrame([d]).T.rename(columns={0:'count'})
      

      这可能会完成工作,但会降低性能,因为我们说键是列然后转置它。所以既然d.items()给了我们可以做的元组

      df = pd.DataFrame(list(d.items()),columns=['country','count'])
      
      df.head()
          country  count
      0       Germany      3
      1   Philippines      8
      2        Mexico      9
      3       Nigeria      9
      4  Saudi Arabia      9
      

      【讨论】:

      • 这是低效的。
      • @John 为什么这无能?
      • @joaoavf:这与 Pandas 的内部存储细节有关。根据%timeit,这个解决方案比我的答案慢 5 倍。即使@jezrael 的解决方案看起来可能不快,也比这快得多。
      • @John 谢谢,知道这一点很有趣!
      猜你喜欢
      • 1970-01-01
      • 2021-06-16
      • 2023-02-21
      • 2021-06-17
      • 2015-10-20
      • 2021-07-11
      • 2013-10-22
      • 1970-01-01
      • 2019-02-22
      相关资源
      最近更新 更多