如果有详细信息,pandas排除总数

时间:2017-08-23 21:30:35

标签: python pandas

有这样的DF:

df = pd.DataFrame({'Art': [210, 211, 212, 310, 420, 421], 'Sum': [300, 120, 180, 250, 650, 650]})
表视图中的

  Art  Sum
0  210  300  # this is total
1  211  120  # children for index 0
2  212  180  # children for index 0
3  310  250  # !!! this is Not total
4  420  650  # this is total
5  421  650  # children for index 4

总行是Art结束0的行,但没有以相同的两位数开头的子行。

艺术210有孩子: 21 1, 21 2

艺术310没有孩子没有行 31

问题:需要删除总行数。

结果需要:

  Art  Sum
1  211  120
2  212  180
3  310  250  # !! this is Not total
5  421  650

怎么做?

2 个答案:

答案 0 :(得分:1)

您可以根据前两位数对 Art 列编制索引并进行相应过滤:

buckets = (df['Art'] // 10).value_counts()
df = df.loc[(df['Art'] // 10).isin(buckets.loc[buckets == 1].index) |
            (df['Art'] % 10 != 0)]

哪个输出:

   Art  Sum
1  211  120
2  212  180
3  310  250
5  421  650

答案 1 :(得分:1)

这也有效:

A=df.Art.astype(str).str.endswith("0")

说明:

  • B=df.Art.astype(str).str[:2].duplicated(keep=False):检查哪些值以0结尾
  • {{1}}:检查哪些值有两个重复的数字。
  • C =否定A& B
  • 使用C作为掩码过滤数据帧。