这类似于this问题,但不同之处在于我担心数据帧的子集。
假设我具有以下数据框:
import pandas as pd
import numpy as np
np.random.seed(42)
df = pd.DataFrame(np.random.randn(5), columns=['A'])
,并且我希望有一个列“ B”,其值为A的负值["neg"]
。但是,当我按照链接的问题中的建议进行以下操作时,我失去了列表的性质我的期望。
idx = df.A < 0
df.loc[idx, "B"] = [["neg"]]*idx.sum()
>>>
Out[17]:
A B
0 0.496714 NaN
1 -0.138264 neg
2 0.647689 NaN
3 1.523030 NaN
4 -0.234153 neg
我在这里做错了什么?同时,我唯一可以解决此问题的方法是:df.loc[idx, 'B'] = df.loc[idx, 'B'].map(lambda x: [x])
。
答案 0 :(得分:1)
您需要提供一个pd.Series
,并且必须提供整个DataFrame的长度才能将["neg"]
与任何一个负值相关联:
df.loc[idx, "B"] = pd.Series([["neg"]]*len(df))
结果:
A B
0 0.496714 nan
1 -0.138264 [neg]
2 0.647689 nan
3 1.523030 nan
4 -0.234153 [neg]
答案 1 :(得分:0)
您可以使用 np.where
,这非常快:
In [1417]: import numpy as np
In [1418]: df['B'] = np.where(df['A'] < 0, 'neg', np.nan)
In [1419]: df
Out[1419]:
A B
0 0.496714 nan
1 -0.138264 neg
2 0.647689 nan
3 1.523030 nan
4 -0.234153 neg