我在向Pandas DataFrame添加新列时遇到了一个问题:我有一个DataFrame,其中每一行代表一个位置数据记录和一个时间戳。这些记录属于旅行,因此每行还包含旅行ID。想象一下,DataFrame看起来像这样:
databaseReference.orderByChild("previousLocation")
.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
databaseReference=FirebaseDatabase.getInstance()
.getReference("Location").child();
//Database child with value of Lang1
myLocation locationDB = new myLocation(lang1, long1);
databaseReference.setValue(locationDB);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
现在我想删除所有记录少于最小记录的记录。我想我可以简单地得到每次旅行的记录数量:
TripID Lat Lon time
0 42 53.55 9.99 74
1 42 53.58 9.99 78
3 42 53.60 9.98 79
6 12 52.01 10.04 64
7 12 52.34 10.05 69
然后我的想法是向DataFrame添加一个额外的列,并用该系列中与每条记录的行程ID相对应的值填充它。然后我就可以摆脱 lengths = df['TripID'].value_counts()
列的值太小的所有行。
但是,我似乎无法找到将长度值输入正确行的方法。任何人都有这个想法,甚至更好地解决整个问题吗?
非常感谢!
修改
我想要的输出应该是这样的:
length
答案 0 :(得分:0)
如果我理解正确,为了获得旅行的长度,你需要得到每次旅行的最长时间和最短时间之间的差异。你可以用groupby语句来做到这一点。
# Groupby, get the minimum and maximum times, then reset the index
df_new = df.groupby('TripID').time.agg(['min', 'max']).reset_index()
df_new['length_of_trip'] = df_new.max - df_new.min
df_new = df_new.loc[df_new.length_of_trip > 90] # to pick a random number
这将为您提供行程长度超过您所需金额的所有行,包括行程ID。
答案 1 :(得分:0)
您可以使用groupby
和transform
直接将长度列添加到DataFrame,如下所示:
df["lengths"] = df[["TripID", "time"]].groupby("TripID").transform("count")
答案 2 :(得分:0)
我设法找到了一个比我原来的方法更好的问题的答案:
df = df.groupby('TripID').filter(lambda x: len(x) > 2)
这可以在Pandas documentation中找到。它消除了所有包含2个或更少元素的组,或者在我的情况下为2个记录或更短的组。
我希望这也可以帮助其他人。