【问题标题】:Splitting a string column according to its values creating new columns根据创建新列的值拆分字符串列
【发布时间】:2021-11-18 22:05:12
【问题描述】:

我有一个看起来像这样的数据框:

df
name     age      symptoms
x        18       fever, headache, cough
y        23       cough
z        89       HTN
a        43       TNT, HTN

我想创建一个看起来像这样的新数据框,具体取决于症状列。

df2
name     age      symptoms                     fever      headache      cough    HTN   TNT
x        18       fever, headache, cough        1          1             1       0      0
y        23       cough                         0          0             1       0      0
z        89       HTN                           0          0             0       1      0
a        43       TNT, HTN                      0          0             0       1      1

所以它实际上为找到的每个新值创建一个新列。

我试过了:

split_ = df["symptoms"].str.split(expand=True)

但是如何创建新列并在数据框中添加 0 和 1 值。

【问题讨论】:

    标签: python pandas string split


    【解决方案1】:

    试试pd.DataFrame.joinstr.get_dummiessep

    df.join(df['symptoms'].str.get_dummies(sep=', '))
    

    输出:

      name  age                symptoms  HTN  TNT  cough  fever  headache
    0    x   18  fever, headache, cough    0    0      1      1         1
    1    y   23                   cough    0    0      1      0         0
    2    z   89                     HTN    1    0      0      0         0
    3    a   43                TNT, HTN    1    1      0      0         0
    

    pd.Series.str.get_dummies 具有sep 参数,您可以在其中为get_dummies 指定所需的分隔符。

    【讨论】:

    • 这也会为每个组合创建新列。例如:它创建的第一行 - 4 列“发烧”、“头痛”、“咳嗽”和“发烧、头痛、咳嗽”。我们可以为此改变什么?
    • @Sahil 好吧,至少对我来说它不……奇怪。
    • @Sahil 如果是这样,请使用df.join(df['symptoms'].str.get_dummies(sep=', ')).filter(regex='^[^,]$', axis=1)
    • 我发现了我的问题。我的原始字符串在逗号后没有空格。这就是为什么它创建了这么多列,它起作用了。非常感谢。
    【解决方案2】:

    您可以使用pandas.get_dummiesjoin 的组合:

    df.join(pd.get_dummies(df['symptoms'].str.split(', ').explode()).groupby(level=0).max())
    

    输出:

      name  age                symptoms  HTN  TNT  cough  fever  headache
    0    x   18  fever, headache, cough    0    0      1      1         1
    1    y   23                   cough    0    0      1      0         0
    2    z   89                     HTN    1    0      0      0         0
    3    a   43                TNT, HTN    1    1      0      0         0
    

    【讨论】:

      【解决方案3】:
      df.join(pd.get_dummies(df['symptoms']))
      
         name  age                symptoms  HTN  TNT, HTN  cough  \
      0    x   18  fever, headache, cough    0         0      0   
      1    y   23                   cough    0         0      1   
      2    z   89                     HTN    1         0      0   
      3    a   43                TNT, HTN    0         1      0   
      
         fever, headache, cough  
      0                       1  
      1                       0  
      2                       0  
      3                       0 
      

      你也可以交叉表

      pd.crosstab([df.name, df.age], df.symptoms).reset_index()
      
      symptoms name  age  HTN  TNT, HTN  cough  fever, headache, cough
      0           a   43    0         1      0                       0
      1           x   18    0         0      0                       1
      2           y   23    0         0      1                       0
      3           z   89    1         0      0                       0
      

      【讨论】:

      • 那不行,因为有多个值的行。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-08
      • 1970-01-01
      • 2021-08-02
      • 2015-02-22
      • 1970-01-01
      • 1970-01-01
      • 2018-10-24
      相关资源
      最近更新 更多