在Pandas DataFrame中将系列索引中的值添加到等值行

时间:2018-05-18 15:51:18

标签: python pandas dataframe

我在向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

3 个答案:

答案 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)

您可以使用groupbytransform直接将长度列添加到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个记录或更短的组。

我希望这也可以帮助其他人。