Python 使用列(字符串数据类型)的值筛选

Python 使用列(字符串数据类型)的值筛选,python,pandas,split-apply-combine,Python,Pandas,Split Apply Combine,我一直在研究一个大型基因组学数据集,该数据集包含对每个样本的多次读取,以确保我们获得数据,但在分析数据时,我们需要将其降到一行,这样我们就不会扭曲数据(当一个实例被多次读取时,将该基因计算为存在6次)。每一行都有一个ID,因此我在ID上使用了pandasdf.groupby()函数。下面是一个表格,以尝试说明我要做的事情: # ID | functionality | v_region_score | constant_region # -----------------

我一直在研究一个大型基因组学数据集,该数据集包含对每个样本的多次读取,以确保我们获得数据,但在分析数据时,我们需要将其降到一行,这样我们就不会扭曲数据(当一个实例被多次读取时,将该基因计算为存在6次)。每一行都有一个ID,因此我在ID上使用了pandas
df.groupby()
函数。下面是一个表格,以尝试说明我要做的事情:

# ID   |  functionality   |   v_region_score   |   constant_region 
# -----------------------------------------------------------------
# 123  |  productive      |      820           |      NaN
#      |  unknown         |      720           |      NaN
#      |  unknown         |      720           |      IgM
# 456  |  unknown         |      690           |      NaN
#      |  unknown         |      670           |      NaN
# 789  |  productive      |      780           |      IgM
#      |  productive      |      780           |      NaN
(编辑)以下是示例数据帧的代码:

df1 = pd.DataFrame([
    [789, "productive", 780, "IgM"],
    [123, "unknown", 720, np.nan],
    [123, "unknown", 720, "IgM"],
    [789, "productive", 780, np.nan],
    [123, "productive", 820, np.nan],
    [456, "unknown", 690, np.nan],
    [456, "unknown", 670, np.nan]], 
    columns=["ID", "functionality", "v_region_score", "constant_region"])
这将是选择正确行的最终输出:

df2 = pd.DataFrame([
    [789, "productive", 780, "IgM"],
    [123, "productive", 820, np.nan],
    [456, "unknown", 690, np.nan]], 
    columns=["ID", "functionality", "v_region_score", "constant_region"])
所以分组后,对于每个组,如果它在功能上有一个“生产性”值,我想保留该行,如果它是“未知”的,我取最高的v_区域值,如果有多个“生产性”值,我取在其恒定区域中有一些值的值

我尝试了几种访问这些值的方法:

id, frame = next(iter(df_grouped))

if frame["functionality"].equals("productive"):
    # do something
只看一组:

x = df_grouped.get_group("1:1101:10897:22442")

for index, value in x["functionality"].items():
    print(value)

# returns the correct value and type "str"
甚至将每组放入一个列表:

new_groups = []

for id, frame in df_grouped:
    new_groups.append(frame)

# access a specific index returns a dataframe
new_groups[30]
所有这些的错误都是“序列的真值是不明确的”,我现在理解了为什么这不起作用,但是我不能使用
a.any()
a.all()
,或者
a.bool()
,因为条件是多么复杂


是否有任何方法可以根据列的值在每个组中选择特定的行?很抱歉问了这么复杂的问题,请提前感谢!:)

您可以从不同的角度来处理您的问题:

  • 根据您的条件对值进行排序
  • 分组依据
    ID
  • 保留每个分组的
    ID的第一个结果
  • 例如:

    df1=df1.sort_值(['ID','functionality','v_region_score','constant_region'],升序=[True,True,False,True],na_position='last')
    df1.groupby('ID').first().reset_index()
    输出[0]:
    ID功能v_区域\分数恒定\区域
    0.820 IgM
    1456未知690南
    2 789 780 IgM
    
    此外,如果要在
    null
    时合并
    constant\u区域的值,可以使用
    fillna(method='ffill')
    ,以便保留存在的值:

    ##排序在这里
    df1['constant_region']=df1.groupby('ID')['constant_region'].fillna(method='ffill')
    df1
    出[1]:
    ID功能v_区域\分数恒定\区域
    4 123 820南
    2123未知720 IgM
    1123未知720 IgM
    5456未知690南
    6456未知670南
    0 789 780 IgM
    3789 780 IgM
    ##在这里分组
    
    hi,请分享您的原始数据帧和预期输出的示例。将此作为指南:非常好的排序,感谢您的评论@Kenan。非常感谢!我甚至没有想过要这样做,而且它非常优雅:)