根据条件在 Pandas 系列中分配值?
Assign values in Pandas series based on condition?
我有一个数据框df
喜欢
A B
1 2
3 4
然后我想创建 2 个新系列
t = pd.Series()
r = pd.Series()
我能够使用条件 cond
为 t
赋值,如下所示
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 循环并通过 df
的每一行检查 cond
中的案例,但我想知道是否 Pandas 提供了一种更有效的方法?
当您将 1 分配给 r 时,如
r = 1
r 现在引用整数 1。因此,当您调用 r[cond] 时,您将整数视为一个系列。
您想首先为 cond 的大小创建一系列 r。像
r = pd.Series(np.ones(cond.shape))
你会嘲笑这是多么容易:
r = cond + 1
原因是 cond
是一个布尔值(True 和 False),计算结果为 1 和 0。如果你给它加 1,它会将布尔值强制转换为 int,这意味着 True 映射到2 和 False 映射到 1。
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
我有一个数据框df
喜欢
A B
1 2
3 4
然后我想创建 2 个新系列
t = pd.Series()
r = pd.Series()
我能够使用条件 cond
为 t
赋值,如下所示
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 的值,否则
如果我试试
r = 1
r[cond] = 2
然后我得到TypeError: 'int' object does not support item assignment
我想我可以 运行 通过 df
的 for 循环并通过 df
的每一行检查 cond
中的案例,但我想知道是否 Pandas 提供了一种更有效的方法?
当您将 1 分配给 r 时,如
r = 1
r 现在引用整数 1。因此,当您调用 r[cond] 时,您将整数视为一个系列。
您想首先为 cond 的大小创建一系列 r。像
r = pd.Series(np.ones(cond.shape))
你会嘲笑这是多么容易:
r = cond + 1
原因是 cond
是一个布尔值(True 和 False),计算结果为 1 和 0。如果你给它加 1,它会将布尔值强制转换为 int,这意味着 True 映射到2 和 False 映射到 1。
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