在 Pandas 中,如果需要删除全部为 0 的行或列,可以通过 .all()
方法来判断行或列是否所有元素都为 0,然后删除这些行或列。
代码示例
示例数据:
import pandas as pd# 示例数据
data = {'A': [0, 2, 0, 4],'B': [0, 0, 0, 0],'C': [0, 10, 11, 12]
}
df = pd.DataFrame(data)print("原始数据:")
print(df)
输出:
A B C
0 0 0 0
1 2 0 10
2 0 0 11
3 4 0 12
1. 删除全部为 0 的行
使用 .all(axis=1)
判断行是否所有值都为 0,然后通过布尔索引删除这些行。
# 删除全为 0 的行
df_cleaned = df.loc[~(df == 0).all(axis=1)]print("\n删除全为 0 的行:")
print(df_cleaned)
输出:
删除全为 0 的行:A B C
1 2 0 10
2 0 0 11
3 4 0 12
2. 删除全部为 0 的列
使用 .all(axis=0)
判断列是否所有值都为 0,然后通过布尔索引删除这些列。
# 删除全为 0 的列
df_cleaned = df.loc[:, ~(df == 0).all(axis=0)]print("\n删除全为 0 的列:")
print(df_cleaned)
输出:
删除全为 0 的列:A C
0 0 0
1 2 10
2 0 11
3 4 12
3. 同时删除全部为 0 的行和列
可以结合以上两个方法,先删除全部为 0 的行,再删除全部为 0 的列。
# 删除全为 0 的行
df = df.loc[~(df == 0).all(axis=1)]# 删除全为 0 的列
df_cleaned = df.loc[:, ~(df == 0).all(axis=0)]print("\n删除全为 0 的行和列:")
print(df_cleaned)
输出:
删除全为 0 的行和列:A C
1 2 10
2 0 11
3 4 12
参数解释
(df == 0).all(axis=1)
:axis=1
表示按行判断,检查每一行是否全为0
。- 返回一个布尔数组,用于判断哪些行满足条件。
(df == 0).all(axis=0)
:axis=0
表示按列判断,检查每一列是否全为0
。- 返回一个布尔数组,用于判断哪些列满足条件。
扩展:原地删除(inplace=True
)
如果希望直接修改原 DataFrame
而不返回新的对象,可以结合 inplace=True
选项。
示例:
# 删除全为 0 的行
df.drop(index=df[(df == 0).all(axis=1)].index, inplace=True)# 删除全为 0 的列
df.drop(columns=df.columns[(df == 0).all(axis=0)], inplace=True)print("\n原地删除全为 0 的行和列:")
print(df)
总结
操作 | 示例代码 |
---|---|
删除全为 0 的行 | df.loc[~(df == 0).all(axis=1)] |
删除全为 0 的列 | df.loc[:, ~(df == 0).all(axis=0)] |
同时删除全为 0 的行和列 | 结合上述两条代码 |
打印删除了哪些行和列
要打印出被删除的行和列,可以在删除操作之前获取需要删除的行或列的索引,并在删除后将这些行或列打印出来。
方法:打印删除的行和列
以下是删除全为 0 的行或列并打印它们的完整代码示例。
示例代码
import pandas as pd# 示例数据
data = {'A': [0, 2, 0, 4],'B': [0, 0, 0, 0],'C': [0, 10, 11, 12]
}
df = pd.DataFrame(data)print("原始数据:")
print(df)# 找到需要删除的行和列
rows_to_delete = df.index[(df == 0).all(axis=1)].tolist() # 行索引
cols_to_delete = df.columns[(df == 0).all(axis=0)].tolist() # 列名称# 删除这些行和列
df_cleaned = df.drop(index=rows_to_delete, columns=cols_to_delete)# 打印删除的行和列
print("\n删除的行索引:", rows_to_delete)
print("删除的列名称:", cols_to_delete)# 打印删除后的 DataFrame
print("\n删除后的数据:")
print(df_cleaned)
代码解释
-
找到需要删除的行和列:
rows_to_delete = df.index[(df == 0).all(axis=1)]
:df == 0
:生成一个布尔矩阵,表示每个值是否为 0。.all(axis=1)
:检查每一行是否全为 0。df.index[...]
:返回需要删除的行的索引。
cols_to_delete = df.columns[(df == 0).all(axis=0)]
:.all(axis=0)
:检查每一列是否全为 0。df.columns[...]
:返回需要删除的列的名称。
-
删除这些行和列:
- 使用
drop()
方法同时删除行和列。
- 使用
-
打印删除的行和列:
rows_to_delete
和cols_to_delete
保存了被删除的行和列的索引和名称,可以直接打印。
-
打印删除后的 DataFrame:
- 检查最终清理后的数据。
输出示例
原始数据:
A B C
0 0 0 0
1 2 0 10
2 0 0 11
3 4 0 12
输出:
删除的行索引: [0]
删除的列名称: ['B']删除后的数据:A C
1 2.0 10
2 0.0 11
3 4.0 12
扩展:原地删除并打印
如果需要直接在原始 DataFrame 中删除,同时打印出被删除的行和列:
# 找到需要删除的行和列
rows_to_delete = df.index[(df == 0).all(axis=1)].tolist()
cols_to_delete = df.columns[(df == 0).all(axis=0)].tolist()# 打印即将删除的行和列
print("\n即将删除的行索引:", rows_to_delete)
print("即将删除的列名称:", cols_to_delete)# 原地删除
df.drop(index=rows_to_delete, columns=cols_to_delete, inplace=True)# 打印最终结果
print("\n删除后的数据:")
print(df)
总结
操作 | 示例代码 |
---|---|
找到需要删除的行索引 | rows_to_delete = df.index[(df == 0).all(axis=1)].tolist() |
找到需要删除的列名称 | cols_to_delete = df.columns[(df == 0).all(axis=0)].tolist() |
打印删除的行和列 | print("删除的行索引:", rows_to_delete) 和 print("删除的列名称:", cols_to_delete) |
删除行和列 | df.drop(index=rows_to_delete, columns=cols_to_delete) |