我有什么
我有一个这样的数据帧:
id value
0 0 5
1 0 5
2 0 6
3 1 7
4 1 7
我想要什么
我想删除id超过一个不同值的所有行。在上面的例子中,我想删除id=0 的所有行
id value
3 1 7
4 1 7
我试过什么
import pandas as pd
df = pd.DataFrame({'id':[0, 0, 0, 1, 1], 'value':[5,5,6,7,7]})
print(df)
id_list = df['id'].tolist()
id_set = set(id_list)
for id in id_set:
temp_list = df.loc[df['id'] == id,'value'].tolist()
s = set(temp_list)
if len(s) > 1:
df = df.loc[df['id'] != id]
它有效,但它丑陋且效率低下
使用熊猫法有更好的滋补方法吗
将GroupBy.transform
和DataFrameGroupBy.nunique
用于Series的唯一值数量,因此可以在boolean indexing
:中进行比较和筛选
df = df[df.groupby('id')['value'].transform('nunique').eq(1)]
print (df)
id value
3 1 7
4 1 7
# Try this code #
import pandas as pd
id1 = pd.Series([0,0,0,1,1])
value = pd.Series([5,5,6,7,7])
data = pd.DataFrame({'id':id1,'value':value})
datag = data.groupby('id')
# to delete rows,that id have different values
datadel = []
for i in set(data.id):
if len(set(datag.get_group(i)['value'])) != 1:
datadel.extend(data.loc[data["id"] == i].index.tolist())
data.drop(datadel, inplace = True)
print(data)