我有一个包含id
列和quantity
列(可以是0或1)的 Dataframe 。
import pandas as pd
df = pd.DataFrame([
{'id': 'thing 1', 'date': '2016-01-01', 'quantity': 0 },
{'id': 'thing 1', 'date': '2016-02-01', 'quantity': 0 },
{'id': 'thing 1', 'date': '2016-09-01', 'quantity': 1 },
{'id': 'thing 1', 'date': '2016-10-01', 'quantity': 1 },
{'id': 'thing 2', 'date': '2017-01-01', 'quantity': 1 },
{'id': 'thing 2', 'date': '2017-02-01', 'quantity': 1 },
{'id': 'thing 2', 'date': '2017-02-11', 'quantity': 1 },
{'id': 'thing 3', 'date': '2017-09-01', 'quantity': 0 },
{'id': 'thing 3', 'date': '2017-10-01', 'quantity': 0 },
])
df.date = pd.to_datetime(df.date, format="%Y-%m-%d")
df
如果对于某个id
,我同时有0和1,我只想返回1;如果只有1,我想返回所有1;如果只有0,我想返回所有0。
我这样做的方法是对每个组应用一个函数,然后重置索引:
def drop_that(dff):
q = len(dff[dff['quantity']==1])
if q >0:
return dff[dff['quantity']==1]
else:
return dff
dfg = df.groupby('id', as_index=False).apply(drop_that)
dfg.reset_index(drop=True)
然而,我只是通过强力谷歌搜索实现了这一点,我真的不知道这是否是一个很好的Pandas实践或如果有替代方法,将是更好的表现。
任何建议都将不胜感激。
4条答案
按热度按时间laximzn51#
您可以尝试:
输出量:
izj3ouym2#
根据您的逻辑,尝试
transform
与max
,如果max eq与原始值相同,则应保留,oxosxuxt3#
另一种可能更接近自然语言的解决方案是:
输出量:
iyfjxgzm4#
以下是使用排名的方法:
输出量: