在pandas中批量填充虚拟变量列

2024-09-29 10:18:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我创建了一个独特的成员级数据帧,如下所示:

memberid      codes       cost
memberA       {c1, c2}    100.0
memberB       {c2, c3}    120.0
memberC       {c1, c5}    200.0

{cd1>的值是^的集合。我试图得到个别代码和成本之间的一些相关性,以便最终使用我所拥有的一些其他特性来构建一个预测模型。在熊猫之外,我创建了一个Counter(),它按流行程度对代码进行排序:

^{pr2}$

common_codes中总共有大约500个代码,我想创建相同数量的虚拟变量,但我不确定如何在Pandas中实现。我试过这样的方法:

for code in common_codes:
    if code in df['codes'].values:
        df['has_'+code] = 1
    else:
        df['has_'+code] = 0

但它不起作用(所有的伪列都是零)。有没有一种简单的方法来填充这些伪列,因为get_dummies不能使用,因为潜在伪变量的“源”位于数据帧之外?除非有一个更简单的方法来做我所寻找的一切,只使用熊猫。在

编辑: 这些代码是诊断代码,因此它们具有诸如C801R911等值。生成的数据帧应如下所示:

memberid      codes       cost    has_c1    has_c2    has_c3
memberA       {c1, c2}    100.0   1         1         0
memberB       {c2, c3}    120.0   0         1         1
memberC       {c1, c5}    200.0   1         0         0

我也尝试过:

for code in common_codes:
    df['has_'+code] = np.where(code in df['codes'], 1, 0)

但这也没用。在

示例数据帧的代码:

data = {'memberid': ['memberA', 'memberB', 'memberC'], 
        'codes': [{c1, c2}, {c2, c3}, {c1, c5}], 
        'cost': [100.0, 120.0, 200.0]}
df = pd.DataFrame(data, columns = ['memberid', 'codes', 'cost'])

Tags: 数据代码indfcodecodeshasc2
1条回答
网友
1楼 · 发布于 2024-09-29 10:18:21

一种方法是使用^{}。在

稍微复杂的是您需要首先将set转换为{},因为{}需要有序的集合。在

import pandas as pd

data = {'memberid': ['memberA', 'memberB', 'memberC'], 
        'codes': [{'c1', 'c2'}, {'c2', 'c3'}, {'c1', 'c5'}], 
        'cost': [100.0, 120.0, 200.0]}

df = pd.DataFrame(data, columns = ['memberid', 'codes', 'cost'])

dummies = pd.get_dummies(df['codes'].apply(list).apply(pd.Series).stack()).sum(level=0)

res = df.join(dummies)

print(res)

  memberid     codes   cost  c1  c2  c3  c5
0  memberA  {c2, c1}  100.0   1   1   0   0
1  memberB  {c2, c3}  120.0   0   1   1   0
2  memberC  {c5, c1}  200.0   1   0   0   1

相关问题 更多 >