为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
翻翻过去那场雪 2023-11-09 10:36:42
我正在尝试将列表中包含值的列转换为按特定列分组的分隔行。这就是我的数据框: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                2111       1            2                3111       1            2                4222       2            3                4222       2            3                5222       2            3                6333       2            1                2333       2            1                3333       2            1                4我试图首先转换为列出列设施:facilities = pd.DataFrame(df.facilities.tolist())然后按列连接并按照相同的方法使用另一个建议的解决方案:df[['id', 'rooms', 'bathrooms']].join(facilities).melt(id_vars=['id', 'rooms', 'bathrooms']).drop('variable', 1)不幸的是,它对我不起作用。另一个解决方案?
查看完整描述

2 回答

?
Cats萌萌

TA贡献1805条经验 获得超9个赞

你需要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


查看完整回答
反对 回复 2023-11-09
?
慕容森

TA贡献1853条经验 获得超18个赞

将列表作为数据框中的值有点尴尬,因此我能想到的解决此问题的一种方法是解压列表并将每个列表存储在其自己的列中,然后使用熔化函数。


# recreate your data

d = {"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 lists

f0, f1, f2 = [],[],[]


for row in df.itertuples():

    f0.append(row.facilities[0])

    f1.append(row.facilities[1])

    f2.append(row.facilities[2])

    

df["f0"] = f0

df["f1"] = f1

df["f2"] = f2


# melt the dataframe

df = pd.melt(df, id_vars=['id', 'rooms', 'bathrooms'], value_vars=["f0", "f1", "f2"], value_name="facilities")


# optionally sort the values and remove the "variable" column

df.sort_values(by=['id'], inplace=True)

df = df[['id', 'rooms', 'bathrooms', 'facilities']]

我认为这应该可以为您提供所需的数据框。


    id  rooms   bathrooms   facilities

0   111 1   2   2

3   111 1   2   3

6   111 1   2   4

1   222 2   3   4

4   222 2   3   5

7   222 2   3   6

2   333 2   1   2

5   333 2   1   3

8   333 2   1   4


查看完整回答
反对 回复 2023-11-09
  • 2 回答
  • 0 关注
  • 116 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信