python - 将列的值与变量进行比较并创建新列
问题描述
我有一个这样的数据框:
Patch Last reward First reward Difference Name Block_No.
group_id
1 3 0.0 0.0 0.0 XYZ 1
2 4 43.0 54.0 11.0 XYZ 1
3 5 0.0 0.0 0.0 XYZ 2
4 6 40.0 65.0 25.0 XYZ 2
5 7 0.0 0.0 0.0 XYZ 3
6 0 0.0 0.0 0.0 XYZ 3
我想根据以下条件创建一个名为“Rep_rate”的新列:if block_no。= 1 并且如果 patch = 3 ,则 Rep_rate = 4 ,否则 Rep_rate = 0。
我试过这样做:
if (df_last['Block_No.']) == 1:
for i in range (len(df_last)):
if df_last['Patch'][i] == 1:
rep = 8
else:
rep = 0
df_last['Rep_Rate'] = rep
if (df_last['Block_No.']) == 2:
for i in range (len(df_last)):
if df_last['Patch'][i] == 1:
rep = 4
else:
rep = 0
df_last['Rep_Rate'] = rep
if (df_last['Block_No.']) == 3:
for i in range (len(df_last)):
if df_last['Patch'][i] == 1:
rep = 8
else:
rep = 0
df_last['Rep_Rate'] = rep
但是,当我尝试此操作时,出现以下错误:
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
解决方案
我不明白您用来填充 RR 列的逻辑,但一种方法可能是:
df['RR'] = 0
if (df['Block'] == 1).all():
for i, row in df.iterrows():
if row['Patch'] == 3:
df.loc[i,'RR'] = 4 # note using df.loc to directly edit the dataframe
elif (df['Block'] == x).all():
for i, row in df.iterrows():
if row['Patch'] == y:
df.loc[i,'RR'] = z
# more if statements as needed
用您需要的任何值替换x
、y
和。z
您遇到的问题是if df["Block"] == 1
. df["Block"] == 1
对于Series 中的每个值是否等于 1 ,代码会生成 True/False 布尔 Series。不支持对 Series 使用 if 语句,因为含义不明确。Pandas 提供ser.any()
和ser.all()
用于明确的布尔评估。例如
if (df["Block"] ==1).all():
# more code ...
if
如果 Block 列中的所有值都等于 1,则将评估语句中的代码。
推荐阅读
- r - 如何处理 R 中具有多索引列的数据帧?
- tensorflow - Keras Step 迭代: generator_output = next(output_generator)
- javascript - 将 .txt 文件中的单词转换为数组?
- ethereum - 缩短合约功能的输入
- observer-pattern - java反应流-订阅者可以返回值吗?
- javascript - 在 Typescript 中将 JSON 字符串转换为 JAVASCRIPT 对象
- c++ - C++ Boost::thread - 内核:陷阱一般保护
- android - Android:可以直接将麦克风保存到 SQLite,而无需读取/写入临时文件?
- java - 导致 Gradle 构建错误的 Firebase 依赖项 - 程序类型已经存在
- android - 滚动时列表视图中的数据被删除