我有一个数据框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是否提供了更有效的方法?
答案 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))