有没有办法动态更新基于先前列名的列名?或者处理数据时列名称的最佳实践是什么?下面我解释一下这个问题:
在处理数据时,我经常需要创建根据前面的列计算得出的列,我设置的名称如下:
|STUDENT|GRADE|GRADE_AVG|GRADE_AVG_FORMATTED|GRADE_AVG_FORMATTED_FINAL
问题是,如果我需要在此数据流的中间进行更改[例如,假设我需要在取平均值之前缩放成绩],我将不得不重命名所有列名称是在这一点之后产生的。见下文:
|STUDENT|GRADE|**GRADE_SCALED**|GRADE_SCALED_AVG|GRADE_SCALED_AVG_FORMATTED|GRADE_SCALED_AVG_FORMATTED_FINAL
由于计算每一列的代码是基于先前的列名称,因此代码中更改名称的过程非常麻烦,特别是对于已生成大量代码的大型数据集。关于如何动态更新列名称有什么建议吗?或者最佳实践?
为了澄清这一点,示例的扩展:
我的代码如下所示:
df[GRADE_AVG] = df[GRADE].apply(something)
df[GRADE_AVG_FORMATTED] = df[GRADE_AVG].apply(something)
df[GRADE_AVG_FORMATTED_FINAL] = df[GRADE_AVG_FORMATTED].apply(something)
...
... more column names based on the previous one..
...
df[FINAL_SCORE] = df[GRADE_AVG_FORMATTED_FINAL_REVISED...etc]
然后...我需要在代码中将 GRADE_AVG 更改为 GRADE_SCALED_AVG。所以我将更改这些列名称。这是一个小例子,但是当有很多基于前一个的列名时,更改代码会变得困惑。
我所做的是更改代码中的所有列名称,如下所示(但这确实不切实际),因此我的问题是:
df[GRADE_SCALED_AVG] = df[GRADE].apply(something)
df[GRADE_SCALED_AVG_FORMATTED] = df[GRADE_SCALED_AVG].apply(something)
df[GRADE_SCALED_AVG_FORMATTED_FINAL] = df[GRADE_SCALED_AVG_FORMATTED].apply(something)
...
... more column names based on the previous one..
...
df[FINAL_SCORE] = df[GRADE_SCALED_AVG_FORMATTED_FINAL_REVISED...etc]
最佳答案
假设您的列是否以 GRADE
开头。你可以这样做。
df.columns = ['GRADE_SCALED_'+ '_'.join(x.split('_')[1:]) if x.startswith('GRADE') else x for x in df.columns]
# sample test case
>>> l = ['abc','GRADE_AVG','GRADE_AVG_TOTAL']
>>> ['GRADE_SCALED_'+ '_'.join(x.split('_')[1:]) if x.startswith('GRADE') else x for x in l]
['abc', 'GRADE_SCALED_AVG', 'GRADE_SCALED_AVG_TOTAL']
关于python - 动态更新 pandas 列名称以避免代码更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57698876/