根据另一列中的字符串在列中分配值

时间:2019-12-21 14:10:22

标签: python pandas

我有以下代码:

set -o pipefail

结果如下表

141

实际数据更长。

我想创建一个脚本,检查col1中的字符串,如果找到子字符串“ SUPER”,则从字符串中获取最后三个字符,并在第二列中分配它们,直到下一个“ SUPER”。 我想实现这一目标:

141

4 个答案:

答案 0 :(得分:1)

我们可以使用Series.str.contains来检查单词SUPER出现的位置, 然后用Series.where保留最后3个字符,并用Series.ffill填充其余字符:

df1['col2'] = df1['col1'].where(df1['col1'].str.contains('SUPER')).str[-3:].ffill()

我们也可以将pd.to_numericerrors = 'coerce'一起使用 将最后3个字符转换为数字,并用Series.ffill

填充其余字符
df1['col2']=pd.to_numeric(df1['col1'].str[-3:],errors='coerce').ffill()

输出

        col1   col2
0  SUPER_280  280.0
1       AASD  280.0
2       AASD  280.0
3  SUPER_350  350.0
4       AASD  350.0
5  SUPER_150  150.0
6       AASD  150.0
7       AASD  150.0

答案 1 :(得分:1)

我们可以使用str.split + Series.ffill

df1['col2'] = df1['col1'].str.split('_').str[1].ffill()

或通过使用np.where有条件地检查col1是否具有SUPER

mask = df1['col1'].str.contains('SUPER')
df1 = df1.assign(col2 = np.where(mask, df1['col1'].str[-3:], np.NaN)).ffill()

        col1 col2
0  SUPER_280  280
1       AASD  280
2       AASD  280
3  SUPER_350  350
4       AASD  350
5  SUPER_150  150
6       AASD  150
7       AASD  150

答案 2 :(得分:1)

Series.str.contains测试值SUPER,通过索引获取列的最后3个值,然后向前填充缺失值:

m = df1['col1'].str.contains('SUPER')

df1.loc[m, 'col2'] = df1.loc[m, 'col1'].str[-3:]
df1['col2'] = df1['col2'].ffill()
print (df1)
        col1 col2
0  SUPER_280  280
1       AASD  280
2       AASD  280
3  SUPER_350  350
4       AASD  350
5  SUPER_150  150
6       AASD  150
7       AASD  150

答案 3 :(得分:1)

它根据字符_分隔表达式,获取最后一个元素,如果是col2,则将其分配给digit,然后将None分配给{{1 }} 如果不。然后,根据先前的值填充col2

ffill