将列表中包含值的列转换为按特定列分组的分隔行

我正在尝试将列表中包含值的列转换为按特定列分组的分隔行。


这就是我的数据框:


id        rooms        bathrooms        facilities             

111       1            2                [2, 3, 4]

222       2            3                [4, 5, 6]

333       2            1                [2, 3, 4]

这就是我需要的数据框:


id        rooms        bathrooms        facility             

111       1            2                2

111       1            2                3

111       1            2                4

222       2            3                4

222       2            3                5

222       2            3                6

333       2            1                2

333       2            1                3

333       2            1                4

我试图首先转换为列出列设施:


facilities = pd.DataFrame(df.facilities.tolist())

然后按列连接并按照相同的方法使用另一个建议的解决方案:


df[['id', 'rooms', 'bathrooms']].join(facilities).melt(id_vars=['id', 'rooms', 'bathrooms']).drop('variable', 1)

不幸的是,它对我不起作用。


另一个解决方案?


翻翻过去那场雪
浏览 70回答 2
2回答

Cats萌萌

你需要explode:df.explode('facilities')#    id  rooms  bathrooms facilities#0  111      1          2          2#0  111      1          2          3#0  111      1          2          4#1  222      2          3          4#1  222      2          3          5#1  222      2          3          6#2  333      2          1          2#2  333      2          1          3#2  333      2          1          4

慕容森

将列表作为数据框中的值有点尴尬,因此我能想到的解决此问题的一种方法是解压列表并将每个列表存储在其自己的列中,然后使用熔化函数。# recreate your datad = {"id":[111, 222, 333],    "rooms": [1,2,2],    "bathrooms": [2,3,1],    "facilities": [[2, 3, 4],[4, 5, 6],[2, 3, 4]]}df = pd.DataFrame(d)# unpack the listsf0, f1, f2 = [],[],[]for row in df.itertuples():    f0.append(row.facilities[0])    f1.append(row.facilities[1])    f2.append(row.facilities[2])    df["f0"] = f0df["f1"] = f1df["f2"] = f2# melt the dataframedf = pd.melt(df, id_vars=['id', 'rooms', 'bathrooms'], value_vars=["f0", "f1", "f2"], value_name="facilities")# optionally sort the values and remove the "variable" columndf.sort_values(by=['id'], inplace=True)df = df[['id', 'rooms', 'bathrooms', 'facilities']]我认为这应该可以为您提供所需的数据框。    id  rooms   bathrooms   facilities0   111 1   2   23   111 1   2   36   111 1   2   41   222 2   3   44   222 2   3   57   222 2   3   62   333 2   1   25   333 2   1   38   333 2   1   4
打开App,查看更多内容
随时随地看视频慕课网APP