我有两行这样的代码:
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/