[英]Creating new column based on existing column in pandas
我有一个如下给出的数据框:
ID1 ID2 Yr-Month Class
1 p1 Feb-19 PE5->SC
1 p2 Feb-19 SC
1 p3 Feb-19 EA->PE5
1 p4 Feb-19 EA->PE5->SC
1 p5 Feb-19 PC->PE5->SC
我需要在现有数据中创建一个名为 Final 的新列,如果从 PE5 到 SC 即 PE5->SC 以下列方式 PE5->SC、EA->PE5->SC、PC->PE5->SC Final 发生转换列值必须是一个 else 下面给出的 0 是预期的 output:
ID1 ID2 Yr-Month Class Final
1 p1 Feb-19 PE5->SC 1
1 p2 Feb-19 SC 0
1 p3 Feb-19 EA->PE5 0
1 p4 Feb-19 EA->PE5->SC 1
1 p5 Feb-19 PC->PE5->SC 1
接下来我可以尝试什么?
通过Series.str.contains
测试子字符串并将True/False
转换为1/0
将值转换为整数:
df['Final'] = df['Class'].str.contains('PE5.*SC').astype(int)
替代numpy.where
:
df['Final'] = np.where(df['Class'].str.contains('PE5.*SC'), 1, 0)
print (df)
ID1 ID2 Yr-Month Class Final
0 1 p1 Feb-19 PE5->SC 1
1 1 p2 Feb-19 SC 0
2 1 p3 Feb-19 EA->PE5 0
3 1 p4 Feb-19 EA->PE5->SC 1
4 1 p5 Feb-19 PC->PE5->SC 1
您可以使用df['Class'].str.contains('PE5->')
创建一个 'Final' 列,然后使用 .loc 查找 Class 包含 'PE5->' 的行,然后设置'Final' 中对应的值为 1
df['Final'] = 0
df.loc[df['Class'].str.contains('PE5->'), 'Final'] = 1
Output:
ID1 ID2 Yr-Month Class Final
1 p1 Feb-19 PE5->SC 1
1 p2 Feb-19 SC 0
1 p3 Feb-19 EA->PE5 0
1 p4 Feb-19 EA->PE5->SC 1
1 p5 Feb-19 PC->PE5->SC 1
编辑:看到 OP 对 Jezrael 的回答的评论后,原来的问题似乎缺少一个案例。 涵盖更新案例的代码将是:
df['Final'] = 0
df.loc[df['Class'].str.contains('PE5->.*SC', regex=True), 'Final'] = 1
Output:
ID1 ID2 Yr-Month Class Final
1 p1 Feb-19 PE5->SC 1
1 p2 Feb-19 SC 0
1 p3 Feb-19 EA->PE5 0
1 p4 Feb-19 EA->PE5->SC 1
1 p5 Feb-19 PE5->PC->SC 1
另一种有趣的方法是使用replace
df['Final'] = df['Class'].replace(['PE5.*SC', '.'], [1, 0], regex=True)
Output:
ID1 | ID2 | 年月 | Class | 最后 |
---|---|---|---|---|
1 | p1 | 2月19日 | PE5->SC | 1 |
1 | p2 | 2月19日 | SC | 0 |
1 | p3 | 2月19日 | EA->PE5 | 0 |
1 | p4 | 2月19日 | EA->PE5->SC | 1 |
1 | p5 | 2月19日 | PC->PE5->SC | 1 |
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.