通过使用列(字符串数据类型)的值来过滤熊猫组

时间:2020-01-29 23:42:30

标签: python pandas split-apply-combine

我一直在研究大型基因组学数据集,其中包含每个样本的多次读取,以确保我们获得了数据,但是在分析数据时,我们需要将其下降到一行,因此我们不会使数据倾斜(当该基因实际上是一个实例被多次读取时,将该基因计数为存在的6次)。每行都有一个ID,因此我在ID上使用了熊猫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_region_score,如果有多个“生产性”值,我取一个在其constant_region中具有一定值的值。

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

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(),因为条件的复杂程度。

有什么办法可以根据其列的值在每个组中选择一个特定的行?很抱歉遇到这么复杂的问题,在此先感谢! :)

1 个答案:

答案 0 :(得分:2)

您可以从另一个角度解决问题:

  1. 根据您的条件对值进行排序
  2. // Before <input className='invoice_table-input invoice_table-input-sm' type='number' key={ Math.random } defaultValue={pageIndex + 1} onChange={e => { const page = e.target.value ? Number(e.target.value) - 1 : 0 gotoPage(page) }} /> // After <input className='invoice_table-input invoice_table-input-sm' type='number' defaultValue={pageIndex + 1} onChange={e => { const page = e.target.value ? Number(e.target.value) - 1 : 0 gotoPage(page) }} />分组
  3. 按分组的ID保留第一结果

例如:

ID

另外,如果要合并df1 = df1.sort_values(['ID','functionality','v_region_score','constant_region'], ascending=[True,True,False,True], na_position='last') df1.groupby('ID').first().reset_index() Out[0]: ID functionality v_region_score constant_region 0 123 productive 820 IgM 1 456 unknown 690 NaN 2 789 productive 780 IgM 中的constant_region中的值,则可以使用null,以便保留存在的值:

fillna(method='ffill')