R语言Dataframe子集化:剔除某国家所有分组下全缺失的变量列
问题描述
现有如下DataFrame:
| country | sector | data1 | data2 |
|---|---|---|---|
| France | 1 | 7 | . |
| France | 2 | 10 | . |
| belgium | 1 | 12 | 7 |
| belgium | 2 | 14 | 8 |
需要对其进行子集化操作:剔除任意一个国家的所有sector分组下均为缺失值的列。本例中data2列在法国的所有sector分组下全为缺失(用"."表示),因此需整列剔除,最终输出如下:
| country | sector | data1 |
|---|---|---|
| France | 1 | 7 |
| France | 2 | 10 |
| belgium | 1 | 12 |
| belgium | 2 | 14 |
解决方案(Pandas实现)
步骤说明:
- 将数据中的缺失标记(".")替换为Pandas可识别的
pd.NA; - 按
country分组,检查每个数据列在各分组内是否全部缺失; - 筛选出存在至少一个国家全缺失的列;
- 从原DataFrame中剔除这些列。
代码实现:
import pandas as pd # 构造原始DataFrame data = { 'country': ['France', 'France', 'belgium', 'belgium'], 'sector': [1, 2, 1, 2], 'data1': [7, 10, 12, 14], 'data2': ['.', '.', 7, 8] } df = pd.DataFrame(data) # 替换缺失标记为pd.NA df.replace('.', pd.NA, inplace=True) # 按country分组,检查各数据列是否在分组内全缺失 group_missing = df.groupby('country').apply(lambda x: x.drop(['country', 'sector'], axis=1).isna().all()) # 找出需要删除的列:至少一个国家全缺失的列 cols_to_drop = group_missing.any()[group_missing.any()].index.tolist() # 剔除目标列 df_cleaned = df.drop(cols_to_drop, axis=1) # 查看结果 print(df_cleaned)
运行结果:
country sector data1 0 France 1 7 1 France 2 10 2 belgium 1 12 3 belgium 2 14
内容的提问来源于stack exchange,提问作者StephenB
相关产品推荐
相关产品推荐

