首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >巨蟒熊猫群

巨蟒熊猫群
EN

Stack Overflow用户
提问于 2021-10-15 15:14:34
回答 3查看 105关注 0票数 2

我有一个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。

我怎样才能组成这个小组?谢谢你的帮忙!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-10-15 15:49:52

各组按药物及影响计数记录的次数。

代码语言:javascript
运行
复制
df_grouped = df.groupby(["Drug","Affect"], as_index=False).count()

产出:

代码语言:javascript
运行
复制
    Drug         Affect        Journal
0   aspirin      downregulate    3
1   aspirin      neutral         1 
2   aspirin      upregulate      2
3   iboruprofen  downregulate    1
4   iboruprofen  upregulate      2

循环检查唯一的药物清单并检查号码。如果下调>上调,将此药物添加到结果列表中。

代码语言:javascript
运行
复制
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)

最后,过滤您的原始数据。

代码语言:javascript
运行
复制
df[df["Drug"].isin(result_drugs)]

如果你只想有数据与所需的药物价值。

代码语言:javascript
运行
复制
pd.DataFrame(result_drugs, columns=["Drug"])

最后产出:

代码语言:javascript
运行
复制
    Drug
0   aspirin
票数 1
EN

Stack Overflow用户

发布于 2021-10-22 11:42:49

另一种选择是使用convtools库:

代码语言:javascript
运行
复制
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"]
票数 1
EN

Stack Overflow用户

发布于 2021-10-22 12:03:16

一种使用filtervalue_counts的简单方法

代码语言:javascript
运行
复制
(
    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返回一个数组,该数组具有最常见项的名称。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69586948

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档