【问题标题】:How do I summarize a data frame as a list combined with an ID?如何将数据框汇总为与 ID 相结合的列表?
【发布时间】:2021-03-12 07:10:05
【问题描述】:

我有一个买家 (buyerid),这个买家可以购买几辆不同的汽车 (carid)。 我想列出他买了哪些车。 在这里,我想总结一下每个买家的所有汽车,并将它们保存为一个列表。

例如,买家 1 购买了 ID 为 1 和 ID 2 的汽车。此列表现在应包含[1,2]。 如何制作这样的清单?

如果我调用 .values.tolist() 方法,那么我将每一行作为一个列表,但我希望买家汇总 carid。

import pandas as pd
d = {'Buyerid': [1,1,2,2,3,3,3,4,5,5,5],
     'Carid': [1,2,3,4,4,1,2,4,1,3,5],
     'Carid2': [1,2,3,4,4,1,2,4,1,3,5]}

df = pd.DataFrame(data=d)

print(df)

ls = df.values.tolist()
print(ls)

    Buyerid  Carid  Carid2
0         1      1       1
1         1      2       2
2         2      3       3
3         2      4       4
4         3      4       4
5         3      1       1
6         3      2       2
7         4      4       4
8         5      1       1
9         5      3       3
10        5      5       5

[[1, 1, 1], [1, 2, 2], [2, 3, 3], [2, 4, 4], [3, 4, 4], [3, 1, 1], [3, 2, 2], [4, 4, 4], [5, 1, 1], [5, 3, 3], [5, 5, 5]]

# What I want as list
[[1,2],[3,4],[4,1,2],[4],[1,3,5]]

【问题讨论】:

    标签: python pandas list dataframe


    【解决方案1】:

    如果需要选择列进行处理,如果顺序不重要,请使用 GroupBy.applynp.unique

    L = (df.groupby(['Buyerid'])[['Carid','Carid2']]
           .apply(lambda x: np.unique(x).tolist()).tolist())
    

    或者如果需要处理没有Buyerid 的所有列,请使用:

    L  = (df.set_index('Buyerid')
            .groupby('Buyerid')
            .apply(lambda x: np.unique(x).tolist())
            .tolist())
    

    print (L)
    [[1, 2], [3, 4], [1, 2, 4], [4], [1, 3, 5]]
    

    如果订购很重要,请使用 DataFrame.melt 进行 unpict 并通过 DataFrame.drop_duplicates 删除重复项:

    L1 = (df.melt('Buyerid')
            .drop_duplicates(['Buyerid','value'])
            .groupby('Buyerid')['value']
            .agg(list)
            .tolist())
    print (L1)
    
    [[1, 2], [3, 4], [4, 1, 2], [4], [1, 3, 5]]
    

    【讨论】:

    • 我从你那里学到的东西,比这个互联网上的任何其他资源都多
    • @ombk - 是的,太棒了,3-4 年前我也从这里的其他人那里学到了;)
    • list(df.groupby("Buyerid").agg(grp_val=("Carid2", lambda x: [i for i in x] )).grp_val)
    • @jezrael 请原谅我的问题。是否可以选择只使用CarID 1 而不使用Carid 2?例如,我是否在来自df.melt ('Buyerid') 的列表中收到CarID 1CarID 2?有没有只能得到CarID 1的地方?
    • @Ella - 当然,然后解决方案更简单,而不是 .apply(lambda x: np.unique(x).tolist() 使用 ['Carid'].apply(lambda x: np.unique(x).tolist()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-09
    • 2023-03-25
    • 1970-01-01
    • 2016-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多