基于Datafram的值获取所有其他列

2024-06-28 20:02:19 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有以下数据框:

>  Name   A     B     C     D   
   John   Nan   1     2     Nan   
   Mike   2     Nan   Nan   Nan   
   Fred   Nan   5     6     7    
   Ana    3     Nan   3     2   
   Fran   2     Nan   1     1

我要做的是对一些列进行排序,这样,我就可以让所有只填写了A列的人(在本例中,Mike):

> df_1 = df[(df['A'] > 0)&(~(df['A'] == 0))]

或者我只希望填充两列(在本例中,无):

df_1 = df[(df['A','B'] > 0)&(~(df['A','B'] == 0))]

我真的很纠结。你知道吗

tks公司


Tags: 数据namedf排序公司nanfredjohn
1条回答
网友
1楼 · 发布于 2024-06-28 20:02:19

isnull+全部

你的语法不正确。您可以使用^{}

mask1 = df['A'] > 0
mask2 = df[['B', 'C', 'D']].isnull().all(1)

df_1 = df_1[mask1 & mask2]

同样,对于第二个查询:

mask1 = (df[['A', 'B']] > 0).all(1)
mask2 = df[['C', 'D']].isnull().all(1)

df_1 = df_1[mask1 & mask2]

这假设您希望显式筛选mask1中大于0的值。如果任何非空数字都足够,则可以使用^{}。你知道吗

不要害怕用这种方法把你的面具分成多行。它将使您的代码更清晰,更易于管理。你知道吗

管道+isnull+所有

更一般地说,您可以编写一个函数来计算和应用布尔级数掩码:

def masker(df, cols_required):

    """ Supply list cols_required. These must be > 0; others null. """

    mask1 = (df[cols_required] > 0).all(1)
    mask2 = df[df.columns.difference(cols_required)].isnull().all(1)
    return df[mask1 & mask2]

df = df.pipe(masker, cols_required=['A', 'B'])

相关问题 更多 >