python - 根据列标题中选择的级别对列求和
问题描述
我有一个 pd.dataframe,它看起来像这样。注意列名代表级别。
df
PC 0 1 2 3
0 PC_1 0.74 0.25 0.1 0.0
1 PC_1 0.72 0.26 0.1 0.1
2 PC_2 0.80 0.18 0.2 0.0
3 PC_3 0.79 0.19 0.1 0.1
我想在现有列旁边创建另外 4 列,并根据分配的条件移动值。
例如:如果 level =1,df 应该是这样的:
df
PC 0 1 2 3 0_1 1_1 2_1 3_1
0 PC_1 0.74 0.25 0.1 0.0 0.0 (0.72+0.25) 0.1 0.0
1 PC_1 0.72 0.26 0.1 0.1 0.0 (0.72+0.26) 0.1 0.1
2 PC_2 0.80 0.18 0.2 0.0 0.0 (0.80+0.18) 0.2 0.0
3 PC_3 0.79 0.19 0.1 0.1 0.0 (0.79+0.19) 0.1 0.0
如果级别=3,
df
PC 0 1 2 3 0_3 1_3 2_3 3_3
0 PC_1 0.74 0.25 0.1 0.0 0.0 0.0 0.0 sum(0.74+0.25+0.1+0.0)
1 PC_1 0.72 0.26 0.1 0.1 0.0 0.0 0.0 sum(0.72+0.26+0.1+0.1)
2 PC_2 0.80 0.18 0.2 0.0 0.0 0.0 0.0 sum(0.80+0.18+0.20+0.0)
3 PC_3 0.79 0.19 0.1 0.1 0.0 0.0 0.0 sum(0.79+0.19+0.1+0.1)
我不知道如何解决问题,正在寻求帮助。
先感谢您。
解决方案
正如您根据标题列标题中选择的级别所写的那样,我了解:
- 没有“外部”级别变量,
- 级别(要求和的列数)仅来自源列名称。
因此,任务实际上是“连接”您的两个预期结果(您仅介绍了如何计算列1_1和3_1)并以相同的方式计算其他新列。
解决方案非常简洁。运行以下单行:
df = df.join(df.iloc[:, 1:].cumsum(axis=1)
.rename(lambda name: str(name) + '_1', axis=1))
细节:
df.iloc[:, 1:]
- 取所有行,从第 1 列开始(列号从 0 开始)。cumsum(axis=1)
- 水平计算累积总和。rename(..., axis=1)
- 重命名列。lambda name: str(name) + '_1'
- 计算新列名的 Lambda 函数。- 到目前为止的结果 - 新列。
df = df.join(...)
- 加入原始 DataFrame 并将结果保存回df下。
推荐阅读
- python - 为什么要绘制一个似乎不正确的直方图?
- swiftui - .listRowBackground() 的问题
- php - 如何从 php post 创建多维数组?
- boolean - 为什么 `!!(a||!a)` 总是正确的?
- excel - Excel“保存”问题但“另存为”有效
- c# - 如果目录中没有 runtimeconfig.dev.json,应用程序将无法运行?
- python - 分钟和每小时数据不再适用于 Tiingo API 和网站
- ios - Progressview tintColorIssue
- java - DL4J 特征重要性
- android - 为什么 Android Studio 更新 SDK 会列出我手机中不再连接的文件?