我有两个数据帧:

df1个,例如:

COL1 COL2 Taxon 
A    B    Canis_lupus
C    D    Felis_catus 
E    F    Mus_musculus
G    H    Canidae
I    J    Felidae
K    L    Muridae
M    N    Canis_lupus_familiaris

df2个,例如:

COL3 Number Taxonomy
1    120    d__Eukaryota;p__Metazoera;c__tetrapoda;o__Carnivora;f__Canidae;g__Canis;s__Canis_lupus
2    129    d__Eukaryota;p__Metazoera;c__tetrapoda;o__Carnivora;f__Canidae;g__Canis;s__Canis_lupus_familiaris
3    134    d__Eukaryota;p__Metazoera;c__tetrapoda;o__Carnivora;f__Felidae;g__Felis;s__Felis_catus
4    234    d__Eukaryota;p__Metazoera;c__tetrapoda;o__Rodentia;f__Muridae;g__Mus;s__Mus_musculus
5    12     d__Eukaryota;p__Metazoera;c__tetrapoda;o__Rodentia;f__Muridae;g__Rattus;s__Rattus_norgevigus
6    289    d__Eukaryota;p__Metazoera;c__tetrapoda;o__Rodentia;f__Muridae;g__Rattus;s__Rattus_Rattus

我想在df1中增加一个新的列,例如它应该是每个df1["Taxon"]df2["Number"]列的总和.

df1个,例如:

COL1 COL2 Taxon                    Sum
A    B    Canis_lupus              120  # which is the sum of df2["Number"] for df2["Taxonomy"] == Canis_lupus
C    D    Felis_catus              134  # which is the sum of df2["Number"] for df2["Taxonomy"] == Felis_catus
E    F    Mus_musculus             234  # which is the sum of df2["Number"] for df2["Taxonomy"] == Mus_musculus
G    H    Canidae                  249  # which is the sum of df2["Number"] for df2["Taxonomy"] == Canidae
I    J    Felidae                  134  # which is the sum of df2["Number"] for df2["Taxonomy"] == Felidae
K    L    Muridae                  535  # which is the sum of df2["Number"] for df2["Taxonomy"] == Muridae
M    N    Canis_lupus_familiaris   129  # which is the sum of df2["Number"] for df2["Taxonomy"] == Canis_lupus_familiaris

有谁有主意吗?

以下是以Python格式表示的数据:

from io import StringIO

data = """COL1\tCOL2\tTaxon
A\tB\tCanis_lupus
C\tD\tFelis_catus
E\tF\tMus_musculus
G\tH\tCanidae
I\tJ\tFelidae
K\tL\tMuridae
M\tN\tCanis_lupus_familiaris"""

# Read the tab-separated data into a DataFrame
df1 = pd.read_csv(StringIO(data), sep='\t')

df2 = pd.DataFrame({'COL3': [1, 2, 3, 4, 5, 6],
                    'Number': [120, 129, 134, 234, 12, 289],
                    'Taxonomy': ['d__Eukaryota;p__Metazoera;c__tetrapoda;o__Carnivora;f__Canidae;g__Canis;s__Canis_lupus',
                                    'd__Eukaryota;p__Metazoera;c__tetrapoda;o__Carnivora;f__Canidae;g__Canis;s__Canis_lupus_familiaris',
                                    'd__Eukaryota;p__Metazoera;c__tetrapoda;o__Carnivora;f__Felidae;g__Felis;s__Felis_catus',
                                    'd__Eukaryota;p__Metazoera;c__tetrapoda;o__Rodentia;f__Muridae;g__Mus;s__Mus_musculus',
                                    'd__Eukaryota;p__Metazoera;c__tetrapoda;o__Rodentia;f__Muridae;g__Rattus;s__Rattus_norgevigus',
                                    'd__Eukaryota;p__Metazoera;c__tetrapoda;o__Rodentia;f__Muridae;g__Rattus;s__Rattus_Rattus']})

推荐答案

try :

df2["Taxonomy"] = df2["Taxonomy"].str.split(";")
df2 = df2.explode("Taxonomy")
df2["Taxonomy"] = df2["Taxonomy"].str.split("__").str[-1]
df2 = df2.groupby("Taxonomy")["Number"].sum()

df1 = df1.merge(df2, left_on="Taxon", right_index=True)
print(df1)

打印:

  COL1 COL2                   Taxon  Number
0    A    B             Canis_lupus     120
1    C    D             Felis_catus     134
2    E    F            Mus_musculus     234
3    G    H                 Canidae     249
4    I    J                 Felidae     134
5    K    L                 Muridae     535
6    M    N  Canis_lupus_familiaris     129

Python-3.x相关问答推荐

使用Python装载. iso文件

如何验证具有内部json字符串的json字符串?

S的两极是什么,相当于大Pandas 的`.ilo‘方法?

使用递归将int转换为字符串

新行是pandas数据帧中旧行的组合

以某种方式分割字符串

Pandas 转换为日期时间

如何将 OLS 趋势线添加到使用 updatemenus 显示数据子集的 plotly 散点图图形对象?

过滤阈值大小数据以使用 Pyspark 或 Python 读取

使用正则表达式提取字符串之间的文本

在python中循环处理时并行写入文件

如何从字典中打印特定键值?

Python:如何判断一个项目是否被添加到一个集合中,没有 2x(hash,lookup)

如何判断一个字符串是否包含有效的 Python 代码

为什么在 Python 中不推荐使用 MutableString?

ImportError:无法在 PyQt5 中导入名称QStringList

ImportError:无法导入名称cross_validate

如何区分文件之类的对象和文件路径之类的对象

将 Python SIGINT 重置为默认信号处理程序

首次使用后 zip 变量为空