对于python DataFrame,我需要为列中的每个元素选择特定字符
df['y'] = df['x'].apply(lambda x: x[1:4])
但收到此错误
TypeError:“ NoneType”对象不可下标
答案 0 :(得分:1)
我认为也需要indexing with str
来处理NaN
和None
的问题:
df = pd.DataFrame({ 'x' : ['abcdef','av', 'a', None, np.nan]})
df['y'] = df['x'].str[1:4]
print (df)
x y
0 abcdef bcd
1 av v
2 a
3 None None
4 NaN NaN
编辑:
我建议先用str[1:]
进行索引,然后再用sparator进行索引,然后再用str[0]
进行可见的先拆分列表:
df = pd.DataFrame({ 'x' : ['abc|etf','av|ee', 'ayty|s', None, np.nan]})
df['y'] = df['x'].str[1:].str.split('|').str[0]
print (df)
x y
0 abc|etf bc
1 av|ee v
2 ayty|s yty
3 None None
4 NaN NaN
编辑:
df = pd.DataFrame({ 'x' : ['abc|Ttf','av|Re', 'ayty|s','ayty|','ayty', None, np.nan]})
def f(x):
#find position
pos = x.find('|')
#if no match return same value
if pos == -1:
return x
#else procees code - split
else:
return x[:pos+2]
mask = df['x'].notnull()
df.loc[mask, 'y'] = df.loc[mask, 'x'].apply(f)
print (df)
x y
0 abc|Ttf abc|T
1 av|Re av|R
2 ayty|s ayty|s
3 ayty| ayty|
4 ayty ayty
5 None NaN
6 NaN NaN
答案 1 :(得分:0)
也可以使用str.slice
>>> df.x.str.slice(1,4)
例如
df.x
0 abcdef
1 abcdef
2 abcdef
3 None
4 abcdef
df.a.str.slice(1,4)
0 bcd
1 bcd
2 bcd
3 None
4 bcd