在groupby中筛选仅适用于python列

时间:2018-06-25 18:32:46

标签: python pandas filter

我希望通过将列减少为仅具有1个唯一值的列来过滤数据框。

采用以下数据框:

df = pd.DataFrame({'id':[4, 5],
                     'id2':[4, 4],
                      'prod':['prod1', 'prod1'],
                      'amount':[45.0, 45.0],
                      'date':['2018-06-06', '2018-05-06'],
                      'region':['east', 'east']})

我想按id2分组,然后删除唯一值超过1个的所有列。

df
   amount        date  id  id2   prod region
0    45.0  2018-06-06   4    4  prod1   east
1    45.0  2018-05-06   5    4  prod1   east

输出应如下所示:

   amount  id2   prod region
0    45.0    4  prod1   east
1    45.0    4  prod1   east

3 个答案:

答案 0 :(得分:2)

您需要先{ "error":{ "errors":[ { "domain":"global", "reason":"forbidden", "message":"Not Authorized to access this resource/api" } ], "code":403, "message":"Not Authorized to access this resource/api" } } ,然后查找唯一值等于1的列。

groupby

输出:

col = (df.groupby(['id2']).nunique() == 1).any()
df[col.index[col]]

答案 1 :(得分:2)

由于id2具有一个唯一值,因此您也可以不使用groupby。

# count unique values per column
d = df.nunique(axis=0)

# select columns with 1 unique value
names = d[d == 1].index.tolist()

# get outpput
print(df[names])

   amount  id2   prod region
0    45.0    4  prod1   east
1    45.0    4  prod1   east

答案 2 :(得分:0)

loc内以利用布尔索引编制

df.loc[:, df.nunique().eq(1)]

   id2   prod  amount region
0    4  prod1    45.0   east
1    4  prod1    45.0   east

类似的答案,但改用lambda。这样可以避免依赖两次引用df并完全内联。

df.loc[:, lambda d: d.nunique().eq(1)]