【问题标题】:Python DataFrame: One-Hot Encode Rows Containing a Specific SubstringPython DataFrame:包含特定子字符串的 One-Hot 编码行
【发布时间】:2021-07-20 01:10:12
【问题描述】:

我有一个包含字符串的 DataFrame。我想创建另一个 DataFrame,通过 one-hot 编码指示字符串是否包含特定月份。

以下面为例:

data = {
'User': ['1', '2', '3', '4']
'Months': ['January; February', 'March; August', 'October; January', 'August, December']}


df = pd.DataFrame(data, columns = ['User','Months'])

我希望生成以下类型的 DataFrame:

         | January | August |
User | 1 |    1    |    0   |
     | 2 |    0    |    1   |
     | 3 |    1    |    0   |
     | 4 |    0    |    1   |

我尝试了以下方法,但我得到一个值错误,它也不会产生所需的 DataFrame:

if df[df['Months'].str.contains('January')]:
    print("1")
else:
    print("0")

提前致谢!

【问题讨论】:

  • 'August, December' 是错字,应该用分号隔开,或者你有一个列,其中分隔符可以是', ''; ' 的组合

标签: python pandas dataframe substring one-hot-encoding


【解决方案1】:

您可以先使用series.str.extract 提取特定的子字符串,然后将其与get_dummies 一起使用,然后再使用join 返回:

l = ['January','August']
out = df[['User']].join(
pd.get_dummies(df['Months'].str.extract(f"({'|'.join(l)})",expand=False)))

print(out)

  User  August  January
0    1       0        1
1    2       1        0
2    3       0        1
3    4       1        0

【讨论】:

    【解决方案2】:
    df = pd.concat([df["User"], df.Months.str.split(r"[,;]")], axis=1).explode(
        "Months"
    )
    print(pd.crosstab(df["User"], df["Months"]))
    

    打印:

    Months   August   December   February   January  August  January  March  October
    User                                                                            
    1             0          0          1         0       0        1      0        0
    2             1          0          0         0       0        0      1        0
    3             0          0          0         1       0        0      0        1
    4             0          1          0         0       1        0      0        0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-02
      • 2020-03-18
      • 1970-01-01
      • 2018-12-17
      • 2017-06-21
      • 1970-01-01
      相关资源
      最近更新 更多