【问题标题】:Convert a dictionary which values are different-length lists into a dataframe将值是不同长度列表的字典转换为数据框
【发布时间】:2019-08-12 16:34:34
【问题描述】:

我有一本字典,其中键是年份,而值是对应的模型。下面是我从字典中打印出来的一段数据。

1975: ['MODEL9808533471'], 
1985: ['MODEL0912768548'], 
1980: ['MODEL1006230072', 'MODEL7898438988'], 
1987: ['MODEL0848444339'], 
1977: ['MODEL7889395724'], 
1962: ['MODEL8686121468'], 
1965: ['MODEL0911532520'],  
2018: ['MODEL1712050002', 'MODEL1712050003', 'MODEL1712050004']

我想要的如下:

                 1962    1965    1975   1977   1980   1985  1987  2018
MODEL9808533471                    1
MODEL0912768548                                         1
MODEL1006230072                                  1
MODEL7898438988                                  1
MODEL0848444339                                               1
MODEL7889395724                           1
MODEL8686121468   1
MODEL0911532520            1
MODEL1712050002                                                     1
MODEL1712050003                                                     1
MODEL1712050004                                                     1

一开始,我认为我们需要循环字典的每个值并构建矩阵。然后 pandas 将输出到一个 csv 文件。
我在 numpy 包中找不到类似的想法,尽管它对于操作矩阵很强大。我在我们的论坛中找到了this link,但列表的长度是相同的。

您知道任何可以帮助我这样做的工具或设施(例如 pandas、numpy 或类似的功能)吗?

谢谢!

【问题讨论】:

    标签: python pandas dataframe dictionary matrix


    【解决方案1】:

    你可以stackcrosstab

    假设d 是你的字典,

    df = pd.DataFrame(d.values(), index=d.keys()).stack().reset_index(level=0)
    
    df.columns = ['year', 'col']
    
    pd.crosstab(df['col'], df['year'])
    
    
    year            1962    1965    1975    1977    1980    1985    1987    2018
    col                             
    MODEL0848444339 0       0       0       0       0       0       1       0
    MODEL0911532520 0       1       0       0       0       0       0       0
    MODEL0912768548 0       0       0       0       0       1       0       0
    MODEL1006230072 0       0       0       0       1       0       0       0
    MODEL1712050002 0       0       0       0       0       0       0       1
    MODEL1712050003 0       0       0       0       0       0       0       1
    MODEL1712050004 0       0       0       0       0       0       0       1
    MODEL7889395724 0       0       0       1       0       0       0       0
    MODEL7898438988 0       0       0       0       1       0       0       0
    MODEL8686121468 1       0       0       0       0       0       0       0
    MODEL9808533471 0       0       1       0       0       0       0       0
    

    【讨论】:

    • 感谢您及时发布您的解决方案。这个对我有用。我想到了交叉表,但没有找到任何合适的教程。
    【解决方案2】:

    完美契合MultiLabelBinarizer from sklearn的用法

    from sklearn.preprocessing import MultiLabelBinarizer
    s = pd.Series(d)
    mlb = MultiLabelBinarizer()
    yourdf=pd.DataFrame(mlb.fit_transform(s),columns=mlb.classes_, index=s.index).T
    yourdf
    Out[121]: 
                     1975  1985  1980  1987  1977  1962  1965  2018
    MODEL0848444339     0     0     0     1     0     0     0     0
    MODEL0911532520     0     0     0     0     0     0     1     0
    MODEL0912768548     0     1     0     0     0     0     0     0
    MODEL1006230072     0     0     1     0     0     0     0     0
    MODEL1712050002     0     0     0     0     0     0     0     1
    MODEL1712050003     0     0     0     0     0     0     0     1
    MODEL1712050004     0     0     0     0     0     0     0     1
    MODEL7889395724     0     0     0     0     1     0     0     0
    MODEL7898438988     0     0     1     0     0     0     0     0
    MODEL8686121468     0     0     0     0     0     1     0     0
    MODEL9808533471     1     0     0     0     0     0     0     0
    

    get_dummies

    s.apply(','.join).str.get_dummies(',').T
    Out[127]: 
                     1975  1985  1980  1987  1977  1962  1965  2018
    MODEL0848444339     0     0     0     1     0     0     0     0
    MODEL0911532520     0     0     0     0     0     0     1     0
    MODEL0912768548     0     1     0     0     0     0     0     0
    MODEL1006230072     0     0     1     0     0     0     0     0
    MODEL1712050002     0     0     0     0     0     0     0     1
    MODEL1712050003     0     0     0     0     0     0     0     1
    MODEL1712050004     0     0     0     0     0     0     0     1
    MODEL7889395724     0     0     0     0     1     0     0     0
    MODEL7898438988     0     0     1     0     0     0     0     0
    MODEL8686121468     0     0     0     0     0     1     0     0
    MODEL9808533471     1     0     0     0     0     0     0     0
    

    【讨论】:

    • 感谢您的及时答复!两种解决方案都适合我的需要。一个额外的需求:我们如何按时间顺序排列列?
    • @Tung 你需要一个订单字典
    猜你喜欢
    • 2020-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-20
    • 2018-07-25
    • 2018-12-28
    • 2016-03-21
    相关资源
    最近更新 更多