我有一个Pandas数据框架(df),包括3列:“药物”、“影响”、“期刊”,每一行都是一篇科学论文,每一篇论文都说明了药物对疾病的影响。示例:
Drug Affect Journal aspirin downregulate paper1 aspririn downregulate paper2 aspirin upregulate paper3 aspirin neutral paper4 aspirin downregulate paper5 aspririn upregulate paper6 iboruprofen upregulate paper7 iboruprofen upregulate paper8 iboruprofen downregulate paper9 other\_drug ... ...
输出应该如下所示:
药物
阿司匹林
我想对df做一个过滤器,只得到在大多数文献中显示能降低疾病的药物,例如,如果阿司匹林有3篇论文告诉它它会下调,2篇论文说它会升高,1篇说它有中性效应,那么我们假设大部分证据表明它的作用是下调。所以我想在过滤过的df里放阿司匹林。因此,伊博鲁洛芬不应该使我的过滤df。
我怎样才能组成这个小组?谢谢你的帮忙!
发布于 2021-10-15 15:49:52
各组按药物及影响计数记录的次数。
df_grouped = df.groupby(["Drug","Affect"], as_index=False).count()产出:
Drug Affect Journal
0 aspirin downregulate 3
1 aspirin neutral 1
2 aspirin upregulate 2
3 iboruprofen downregulate 1
4 iboruprofen upregulate 2循环检查唯一的药物清单并检查号码。如果下调>上调,将此药物添加到结果列表中。
result_drugs = []
for drug in np.unique(df["Drug"]:
numberOfdownregulate = df_grouped[(df_grouped["Drug"] == drug) & (df_grouped["Affect"] == "downregulate")].Journal.values[0]
numberOfupregulate = df_grouped[(df_grouped["Drug"] == drug) & (df_grouped["Affect"] == "upregulate")].Journal.values[0]
result = numberOfdownregulate - numberOfupregulate
if result > 0:
result_drugs.append(drug)最后,过滤您的原始数据。
df[df["Drug"].isin(result_drugs)]如果你只想有数据与所需的药物价值。
pd.DataFrame(result_drugs, columns=["Drug"])最后产出:
Drug
0 aspirin发布于 2021-10-22 11:42:49
另一种选择是使用convtools库:
from convtools import conversion as c
# fmt: off
input_data = [
{'Drug': 'aspirin', 'Affect': 'downregulate', 'Journal': 'paper1'},
{'Drug': 'aspririn', 'Affect': 'downregulate', 'Journal': 'paper2'},
{'Drug': 'aspirin', 'Affect': 'upregulate', 'Journal': 'paper3'},
{'Drug': 'aspirin', 'Affect': 'neutral', 'Journal': 'paper4'},
{'Drug': 'aspirin', 'Affect': 'downregulate', 'Journal': 'paper5'},
{'Drug': 'aspririn', 'Affect': 'upregulate', 'Journal': 'paper6'},
{'Drug': 'iboruprofen', 'Affect': 'upregulate', 'Journal': 'paper7'},
{'Drug': 'iboruprofen', 'Affect': 'upregulate', 'Journal': 'paper8'},
{'Drug': 'iboruprofen', 'Affect': 'downregulate', 'Journal': 'paper9'}
]
# fmt: on
converter = (
c.group_by(c.item("Drug"))
.aggregate(
{
"drug": c.item("Drug"),
"down": c.ReduceFuncs.Count(
where=c.item("Affect") == "downregulate"
),
"up": c.ReduceFuncs.Count(where=c.item("Affect") == "upregulate"),
"neutral": c.ReduceFuncs.Count(
where=c.item("Affect") == "neutral"
),
}
)
.filter(
c.and_(
c.item("down") > c.item("up"),
c.item("down") > c.item("neutral"),
)
)
# after the above the result is:
# [{"drug": "aspirin", "down": 2, "up": 1, "neutral": 1}]
.iter(c.item("drug"))
.as_type(list)
.gen_converter()
)
assert converter(input_data) == ["aspirin"]发布于 2021-10-22 12:03:16
一种使用filter和value_counts的简单方法
(
df.groupby("Drug")
.filter(lambda x: x["Affect"].value_counts().nlargest(1).index[0] == "downregulate")
.get(["Drug"])
.drop_duplicates()
)values_counts返回Affect列中每个唯一值的计数。
nlargest(1)返回计数最高的单行
index返回一个数组,该数组具有最常见项的名称。
https://stackoverflow.com/questions/69586948
复制相似问题