Python dataframe:如果其他列满足,则在某些行中填充文本
Python dataframe: fill text in certain rows if other columns satisfied
我有两列。我想根据第一列中的值在第二列中填充文本。
这是我的代码:
df = pd.DataFrame({'value':[100,10,-5,2],'text':['fine','good',np.nan,np.nan]})
df['text'] = np.where(df['value']<5,'bad')
当前输出:
ValueError: either both or neither of x and y should be given
预期输出:
df =
value text
0 100 fine
1 10 good
2 -5 bad
3 2 bad
我的代码有什么问题?
更新:下面给出的三个答案的时间安排,numpy 胜出。这是我原来的 df 包含 25 万行:
%timeit df['text'] = np.where(df['value']<5,'bad',df['text'])
18.2 ms ± 1.4 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit df.loc[df['value']<5,'text'] = 'bad'
31.3 ms ± 4.1 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
%timeit df['text'] = df['text'].mask(df['value']<5, 'bad')
22.8 ms ± 602 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
如错误消息所述,如果条件不成立,您应该提供 np.where
应映射到的第二个值:
df['text'] = np.where(df['value']<5, 'bad', df['text'])
这输出:
value text
0 100 fine
1 10 good
2 -5 bad
3 2 bad
您需要设置您的条件的另一部分:
df['text'] = np.where(df['value'] < 5, 'bad', df['text'])
print(df)
# Output
value text
0 100 fine
1 10 good
2 -5 bad
3 2 bad
分配回来
df.loc[df['value']<5, 'text'] = 'bad'
df
Out[67]:
value text
0 100 fine
1 10 good
2 -5 bad
3 2 bad
你可以试试Series.mask
df['text'] = df['text'].mask(df['value'] < 5, 'bad')
print(df)
value text
0 100 fine
1 10 good
2 -5 bad
3 2 bad
我有两列。我想根据第一列中的值在第二列中填充文本。
这是我的代码:
df = pd.DataFrame({'value':[100,10,-5,2],'text':['fine','good',np.nan,np.nan]})
df['text'] = np.where(df['value']<5,'bad')
当前输出:
ValueError: either both or neither of x and y should be given
预期输出:
df =
value text
0 100 fine
1 10 good
2 -5 bad
3 2 bad
我的代码有什么问题?
更新:下面给出的三个答案的时间安排,numpy 胜出。这是我原来的 df 包含 25 万行:
%timeit df['text'] = np.where(df['value']<5,'bad',df['text'])
18.2 ms ± 1.4 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit df.loc[df['value']<5,'text'] = 'bad'
31.3 ms ± 4.1 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
%timeit df['text'] = df['text'].mask(df['value']<5, 'bad')
22.8 ms ± 602 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
如错误消息所述,如果条件不成立,您应该提供 np.where
应映射到的第二个值:
df['text'] = np.where(df['value']<5, 'bad', df['text'])
这输出:
value text
0 100 fine
1 10 good
2 -5 bad
3 2 bad
您需要设置您的条件的另一部分:
df['text'] = np.where(df['value'] < 5, 'bad', df['text'])
print(df)
# Output
value text
0 100 fine
1 10 good
2 -5 bad
3 2 bad
分配回来
df.loc[df['value']<5, 'text'] = 'bad'
df
Out[67]:
value text
0 100 fine
1 10 good
2 -5 bad
3 2 bad
你可以试试Series.mask
df['text'] = df['text'].mask(df['value'] < 5, 'bad')
print(df)
value text
0 100 fine
1 10 good
2 -5 bad
3 2 bad