python - 任何无需重命名列即可进行过滤的方法

标签 python pandas filter

我有两行这样的代码:

df.rename(columns={'Name': 'q1', 'Age': 'q2', 'Weight': 'q3', 'Height': 'q4', 'DOB': 'q5', 'Donor': 'q6'},  inplace = True)
df = (df.filter(like = 'q').groupby([df['Name'], df['Type'],df['DATE']]).agg(lambda x: x.eq(4).sum()/x.count()))

我想按特定列进行过滤,然后执行 groupby,但目前,为了做到这一点,我将每个列重命名为 q1 - q6,然后过滤“q”是否是该列的开头。

我可以在不将列名称重命名为 q 的情况下执行此操作吗?

最佳答案

只需选择列,可以选择以编程方式重命名(仅在需要时)聚合后:

cols = ['Name', 'Age', 'Weight', 'Height', 'DOB', 'Donor']
out_cols = [f'q{x+1}' for x in range(len(cols))]

out = (df[cols]
       .groupby([df['Name'], df['Type'],df['DATE']], as_index=False)
       .agg(lambda x: x.eq(4).sum()/x.count())
       .set_axis(out_cols, axis=1) # optional
      )

或者在聚合期间重命名:

cols = ['Name', 'Age', 'Weight', 'Height', 'DOB', 'Donor']

out = (df
       .groupby([df['Name'], df['Type'],df['DATE']])
       .agg(**{f'q{x}': (c, lambda x: x.eq(4).sum()/x.count())
               for x,c in enumerate(cols)})
      )

输出示例:

# first approach with renaming
  q1   q2   q3   q4   q5   q6
0  A  0.0  0.0  0.0  0.0  0.0
1  A  0.0  0.0  0.0  0.0  0.0
2  A  0.0  0.0  0.0  0.0  0.0
3  A  0.0  0.0  0.0  0.0  0.0
4  B  0.0  0.0  0.0  0.0  0.0
5  B  0.0  0.0  0.0  0.0  0.0
6  B  0.0  0.0  0.0  0.0  0.0
7  C  0.0  0.0  0.0  0.0  0.0
8  C  0.0  0.0  0.0  0.0  0.0
9  C  0.0  0.0  0.0  0.0  0.0

# first approach without renaming
  Name  Age  Weight  Height  DOB  Donor
0    A  0.0     0.0     0.0  0.0    0.0
1    A  0.0     0.0     0.0  0.0    0.0
2    A  0.0     0.0     0.0  0.0    0.0
3    A  0.0     0.0     0.0  0.0    0.0
4    B  0.0     0.0     0.0  0.0    0.0
5    B  0.0     0.0     0.0  0.0    0.0
6    B  0.0     0.0     0.0  0.0    0.0
7    C  0.0     0.0     0.0  0.0    0.0
8    C  0.0     0.0     0.0  0.0    0.0
9    C  0.0     0.0     0.0  0.0    0.0


# second approach
                       q0   q1   q2   q3   q4   q5
Name Type DATE                                    
A    A    2023-10-10  0.0  0.0  0.0  0.0  0.0  0.0
          2023-10-12  0.0  0.0  0.0  0.0  0.0  0.0
     B    2023-10-11  0.0  0.0  0.0  0.0  0.0  0.0
          2023-10-13  0.0  0.0  0.0  0.0  0.0  0.0
B    A    2023-10-11  0.0  0.0  0.0  0.0  0.0  0.0
     B    2023-10-10  0.0  0.0  0.0  0.0  0.0  0.0
          2023-10-12  0.0  0.0  0.0  0.0  0.0  0.0
C    A    2023-10-11  0.0  0.0  0.0  0.0  0.0  0.0
          2023-10-13  0.0  0.0  0.0  0.0  0.0  0.0
     B    2023-10-12  0.0  0.0  0.0  0.0  0.0  0.0

关于python - 任何无需重命名列即可进行过滤的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77262951/

相关文章:

python - 如何找到变量列表的索引位置?

python - 如何将导致错误的数据插入到单独的文件中,同时处理列的其余部分?

mysql - WordPress 自定义订单按帖子标题中的姓氏过滤

javascript - 将绘图中的数据保存到 csv 或 excel 文件中

arrays - Swift 中的数组操作和重新排序

javascript - 同位素和灯箱,如何仅在灯箱中显示可见(过滤)图像

python - 读取 tfrecord : DecodeError: Error parsing message

python - python中的pass和continue有什么区别

python - 查找字符串中出现的所有字符

python - 使用 SI 比例因子对数字进行排序