根据条件在Pandas系列中分配值?

时间:2016-02-13 00:46:37

标签: python pandas dataframe series

我有一个数据框df,如

A B
1 2
3 4

然后我要创建2个新系列

t = pd.Series()
r = pd.Series()

我可以使用t条件为cond分配值,如下所示

t = "1+" + df.A.astype(str) + '+' + df.B.astype(str)
cond = df['A']<df['B']
team[cond] = "1+" + df.loc[cond,'B'].astype(str) + '+' + df.loc[cond,'A'].astype(str)

但是我遇到了r的问题。我只希望r在满足con时包含值2,否则包含1

如果我尝试

r = 1
r[cond] = 2

然后我得到TypeError: 'int' object does not support item assignment

我想我可以通过df运行for循环,然后通过cond的每一行查看df中的案例,但我想知道Pandas是否提供了更有效的方法?

2 个答案:

答案 0 :(得分:2)

你会嘲笑这是多么容易:

r = cond + 1

原因是cond是一个布尔值(True和False),它计算为1和0.如果你向它添加一个,它会将布尔值强制转换为int,这意味着True映射到2和虚假地图到一个。

df = pd.DataFrame({'A': [1, 3, 4], 
                   'B': [2, 4, 3]})

cond = df['A'] < df['B']

>>> cond + 1
0    2
1    2
2    1
dtype: int64

答案 1 :(得分:0)

中为r分配1时
r = 1

r现在引用整数1.所以当你调用r [cond]时,你正在处理一个类似于系列的整数。

你想首先为con的大小创建一系列的那些。像

这样的东西
r = pd.Series(np.ones(cond.shape))