python - 如果多个列上的条件,熊猫数据框中的新列无法获得预期值基础
问题描述
我有一个熊猫数据框,其数据如下表所示:
Negative Positive Neutral
True False False
True False False
False False True
False True False
True False False
False True False
True False False
True False False
我正在做的是创建一个新列(“Overall”)并根据条件,如果列“Positive”的行值为 True,Overall 列的值为“Positive”,如果列“Negative”为 True,那么总体将采用“负”,否则为“中性”值:
def flag_df(df):
if (df["Negative"] == "True") and (df["Positive"] == "False") and (df["Neutral"] == "False"):
return "Negative"
elif (df["Negative"] == "False") and (df["Positive"] == "True") and (df["Neutral"] == "False"):
return "Positive"
else :
return "Neutral"
fdf['Overall'] = fdf.apply(flag_df, axis = 1)
但不幸的是,我不知道我做错了什么,“总体”列中的所有观察结果都是“中性”:
Negative Positive Neutral Overall
True False False Neutral
True False False Neutral
False False True Neutral
False True False Neutral
True False False Neutral
False True False Neutral
True False False Neutral
True False False Neutral
有人可以让我知道我在哪里做错了吗?
解决方案
如果所有列都是布尔值并且每行总是只有一个True
可以使用DataFrame.dot
:
print (df.dtypes)
Negative bool
Positive bool
Neutral bool
dtype: object
df['Overall'] = df.dot(df.columns)
print (df)
Negative Positive Neutral Overall
0 True False False Negative
1 True False False Negative
2 False False True Neutral
3 False True False Positive
4 True False False Negative
5 False True False Positive
6 True False False Negative
7 True False False Negative
如果多个列名称使用:
cols = ['Negative', 'Positive', 'Neutral']
df['Overall'] = df[cols].dot(pd.Index(cols))
或者:
df1 = df[cols]
df['Overall'] = df1.dot(df1.columns)
您的解决方案应更改为numpy.select
:
m1 = df["Negative"] & ~df["Positive"] & ~df["Neutral"]
m2 = ~df["Negative"] & df["Positive"] & ~df["Neutral"]
df['Overall'] = np.select([m1, m2], ['Negative','Positive'], default='Neutral')
print (df)
Negative Positive Neutral Overall
0 True False False Negative
1 True False False Negative
2 False False True Neutral
3 False True False Positive
4 True False False Negative
5 False True False Positive
6 True False False Negative
7 True False False Negative
如果可能,每行可以有多个 match - True
s 将分隔符添加到 anmes 列,然后删除 last ,
:
print (df)
Negative Positive Neutral
0 True False True
1 True False False
2 False False True
3 False True False
4 True False False
5 False True False
6 True False False
7 True False False
df['Overall'] = df.dot(df.columns + ',').str.rstrip(',')
print (df)
Negative Positive Neutral Overall
0 True False True Negative,Neutral
1 True False False Negative
2 False False True Neutral
3 False True False Positive
4 True False False Negative
5 False True False Positive
6 True False False Negative
7 True False False Negative
推荐阅读
- flutter - 点击按钮滚动列表视图
- drools - 如何在流口水中获得 RuleContex?
- python - 使用 pymongo 从 MongoDB 加载数据时出现内存错误
- javascript - 如何在两个不同的列中显示地图的结果
- c# - 使用 WCF 反序列化 XML 字符串
- db2 - 如何将 SQL 传递给在 DB2 中以字符串形式出现的 Cursor?
- multithreading - ElasticSearch:为扩展线程配置保持活动时间
- android - ErrorAAPT:错误:找不到资源 drawable/ic_baseline_arrow_back(又名 com.aperturedigital.photowall12:drawable/ic_baseline_arrow_back)
- server - 用于微服务的 ibm websphere liberty 本地配置
- wordpress - Woocommerce 功能更新所有产品