
本文介绍如何在pandas dataframe中,针对由特定标记定义的分段数据,筛选出符合条件的数值并进行累加求和。通过初始化累加变量、迭代分段、应用条件查询及累加每段结果,最终获得一个总和,避免了仅输出各段独立和的问题,从而实现对复杂数据结构的有效统计分析。
在实际数据分析场景中,我们经常会遇到从大型或结构复杂的文本文件中提取数据并加载到Pandas DataFrame的情况。这些数据可能不是一个单一的连续表格,而是由特定标记(如“START”、“END”或特定类型标识符)分隔的多个逻辑数据段。我们的目标通常是对每个这样的数据段进行独立分析,例如,在每个段内筛选出满足特定条件的行,并对这些行的某一列数值进行求和。
一个常见的挑战是,当我们在循环中处理每个数据段并计算其内部总和时,如果直接在循环内部打印或不进行累加,最终得到的是每个段的独立总和,而非所有符合条件的段的总和。例如,如果一个DataFrame包含多个“Dog”类型的数据段,每个段内都有“Wolf”品种的年龄数据,我们希望得到所有“Dog”段中“Wolf”品种年龄的总和,而不是每个“Dog”段中“Wolf”年龄的独立总和。
解决上述问题的关键在于引入一个“累加器”变量,并在每次迭代处理完一个数据段后,将其计算出的局部总和累加到这个全局累加器中。具体步骤包括:
下面我们将通过一个具体的Python和Pandas代码示例来演示如何实现分段条件求和。
首先,我们创建一个示例DataFrame,它模拟了具有不同“Type”和“breed”的数据,并包含“Age”这一需要求和的数值列。接着,我们根据“Type”列中的特定值(例如 'Dog' 和 'Cat')来定义数据段的起始和结束索引。
import pandas as pd
# 示例数据
data = {
'Type': ['Dog', '', '', 'Cat', '', '', 'Dog', '', '', 'Cat'],
'breed': ['', 'Wolf', 'bork', '', '', '', '', 'Wolf', 'bork', ''],
'Age': [20, 21, 19, 18, 20, 21, 19, 15, 16, 0]
}
df = pd.DataFrame(data)
print("原始DataFrame:")
print(df)
# 定义数据段的起始和结束索引
# 这里我们假设'Dog'标记一个段的开始,'Cat'标记一个段的结束
Start = df[df['Type'] == 'Dog'].index.astype(int).tolist()
End = df[df['Type'] == 'Cat'].index.astype(int).tolist()
print(f"\n起始索引 (Start): {Start}")
print(f"结束索引 (End): {End}")在处理循环之前,我们需要声明一个变量 total_sum 并将其初始化为 0。
total_sum = 0
现在,我们遍历 Start 索引列表。对于每个起始索引,我们使用对应的 End 索引来切片DataFrame,得到当前的数据段 Frip。接着,在 Frip 内部,我们筛选出 breed 为 "Wolf" 的行,并对它们的 'Age' 列进行求和,最后将这个局部和累加到 total_sum 中。
# 迭代分段并进行累加求和
for index, start_idx in enumerate(Start):
# 确保End索引存在且与Start索引匹配
if index < len(End):
end_idx = End[index]
# 切片获取当前数据段
Frip = df.iloc[start_idx : end_idx]
# 筛选出 'breed' 为 "Wolf" 的行,并对 'Age' 列求和
# pd.to_numeric 确保 'Age' 列是数值类型,即使其中包含非数值也会尝试转换
current_segment_sum = pd.to_numeric(Frip.query('breed == "Wolf"')['Age'], errors='coerce').sum()
# 将当前分段的求和结果累加到总和中
total_sum += current_segment_sum
else:
print(f"警告:起始索引 {start_idx} 没有对应的结束索引。该段将被跳过。")
# 输出最终的总和
print(f"\n所有符合条件的分段中 'Wolf' 品种 'Age' 的总和: {total_sum}")将上述步骤整合到一起,得到完整的解决方案代码:
import pandas as pd
# 示例数据
data = {
'Type': ['Dog', '', '', 'Cat', '', '', 'Dog', '', '', 'Cat'],
'breed': ['', 'Wolf', 'bork', '', '', '', '', 'Wolf', 'bork', ''],
'Age': [20, 21, 19, 18, 20, 21, 19, 15, 16, 0]
}
df = pd.DataFrame(data)
print("原始DataFrame:")
print(df)
# 定义数据段的起始和结束索引
Start = df[df['Type'] == 'Dog'].index.astype(int).tolist()
End = df[df['Type'] == 'Cat'].index.astype(int).tolist()
print(f"\n起始索引 (Start): {Start}")
print(f"结束索引 (End): {End}")
# 初始化累加变量
total_sum = 0
# 迭代分段并进行累加求和
for index, start_idx in enumerate(Start):
if index < len(End):
end_idx = End[index]
Frip = df.iloc[start_idx : end_idx]
# 在当前分段内筛选 'breed' 为 "Wolf" 的行,并对 'Age' 列求和
# 使用 errors='coerce' 将无法转换的值设为 NaN,然后 sum() 会忽略 NaN
current_segment_sum = pd.to_numeric(Frip.query('breed == "Wolf"')['Age'], errors='coerce').sum()
# 累加到总和
total_sum += current_segment_sum
else:
print(f"警告:起始索引 {start_idx} 没有对应的结束索引。该段将被跳过。")
# 输出最终总和
print(f"\n所有符合条件的分段中 'Wolf' 品种 'Age' 的总和: {total_sum}")输出结果:
原始DataFrame: Type breed Age 0 Dog None 20 1 Wolf 21 2 None bork 19 3 Cat None 18 4 None 20 5 None 21 6 Dog None 19 7 Wolf 15 8 None bork 16 9 Cat None 0 起始索引 (Start): [0, 6] 结束索引 (End): [3, 9] 所有符合条件的分段中 'Wolf' 品种 'Age' 的总和: 36
通过本文的教程,我们学习了如何在Pandas DataFrame中有效地处理分段数据,并对每个分段内符合特定条件的数值进行累加求和。核心思想是利用一个累加器变量在循环中逐步积累结果。这种方法不仅解决了获取单个总和而非多个独立总和的问题,而且通过清晰的步骤和代码示例,展示了处理复杂数据结构时的灵活性和专业性。掌握这一技巧,将有助于您在数据分析工作中更精确、高效地从结构化数据中提取有价值的信息。
以上就是Pandas DataFrame中分段条件求和技巧:累加特定区域数值的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号