根据另一列的条件连接一列的字符串

Sas*_*hci 3 python pandas

我有一个数据框,我想删除名为“sample”的列上的重复项,并将基因和状态列中的字符串信息添加到新列,如附图所示。

提前非常感谢

在此输入图像描述

下面是数据框的修改版本。其中行中的基因被实际的基因名称替换在此输入图像描述

lig*_*ist 5

df是你的 Pandas DataFrame。

def new_1(g):
    return ','.join(g.gene)

def new_2(g):
    return ','.join(g.gene + '-' + g.status)    

new_1_data = df.groupby("sample").apply(new_1).to_frame(name="new_1")
new_2_data = df.groupby("sample").apply(new_2).to_frame(name="new_2")

new_data = pd.merge(new_1_data, new_2_data, on="sample")
new_df = pd.merge(df, new_data, on="sample").drop_duplicates("sample")
Run Code Online (Sandbox Code Playgroud)

如果您希望将“sample”作为列而不是索引,则添加

new_df = new_df.reset_index(drop=True)
Run Code Online (Sandbox Code Playgroud)

最后,由于您没有指定要保留哪些原始重复行,我只是使用 Pandas 的默认行为并删除除第一次出现之外的所有行。

编辑

我将您的示例转换为以下 CSV 文件(以“,”分隔),我将其称为“data.csv”。

sample,gene,status
ppar,p53,gain
ppar,gata,gain
ppar,nb,loss
srty,nf1,gain
srty,cat,gain
srty,cd23,gain
tygd,brac1,loss
tygd,brac2,gain
tygd,ras,loss
Run Code Online (Sandbox Code Playgroud)

我将此数据加载为

# Default delimiter is ','. Pass `sep` argument to specify delimiter.
df = pd.read_csv("data.csv")  
Run Code Online (Sandbox Code Playgroud)

运行上面的代码并打印数据帧会产生输出

  sample   gene status            new_1                           new_2
0   ppar    p53   gain      p53,gata,nb      p53-gain,gata-gain,nb-loss
3   srty    nf1   gain     nf1,cat,cd23     nf1-gain,cat-gain,cd23-gain
6   tygd  brac1   loss  brac1,brac2,ras  brac1-loss,brac2-gain,ras-loss
Run Code Online (Sandbox Code Playgroud)

这正是您的示例中给出的预期输出。

请注意,最左边的数字列 (0, 3, 6) 是合并后生成的原始数据帧索引的剩余部分。当您将此数据帧写入文件时,您可以通过设置排除index=Falsedf.to_csv(...)

编辑2

我检查了您通过电子邮件发送给我的 CSV 文件。CSV 文件标题中的“gene”一词后面有一个空格

将 CSV 文件的第一行从

sample,gene ,status
Run Code Online (Sandbox Code Playgroud)

sample,gene,status
Run Code Online (Sandbox Code Playgroud)

此外,您的条目中还有空格。如果您想删除它们,您可以

# Strip spaces from entries. Only works for string entries
df = df.applymap(lambda x: x.strip()) 
Run Code Online (Sandbox Code Playgroud)