首页 > 解决方案 > 如何在熊猫中选择每个唯一记录的第一行和最后一行

问题描述

如何选择所有唯一记录的第一行和最后一行。

我尝试了下面的代码,但我知道它不正确。首先它只需要一列,而其他列在这一列中被遗漏了。

for key, value in df['x'].iteritems():
    # print(key, value)
    if temp != value:
        print(temp)
    temp = value

预期输出记录在表中以黄色突出显示。

标签: python

解决方案


更新:在更好地理解了 OP 的问题之后,我想我已经想出了正确的解决方案

初始表

+----------------+
|x         |y |z |
+----------------+
|111000004 |1 |1 |
|111000014 |5 |1 |
|111000014 |5 |2 |
|111001605 |2 |1 |
|111001605 |2 |2 |
|111003425 |1 |1 |
|111003425 |1 |2 |
|111003425 |1 |3 |
|111003748 |4 |1 |
|111003748 |4 |2 |
|111003748 |3 |4 |
|111003748 |2 |3 |
|111003748 |1 |1 |
+----------------+

OP 提到它是一个时间序列数据,所以我按时间列(“x”)对数据进行分组并得到第一行和最后一行。我附加了这两个表并按索引(“x”)对它们进行了排序,并删除了重复项以清理输出。

g = df.groupby(['x'])
d = g.first().append(g.last()).sort_index().reset_index().drop_duplicates()

最终结果d如下。

+----------------+
|x         |y |z |
+----------------+
|111000004 |1 |1 |
|111000014 |5 |1 |
|111000014 |5 |2 |
|111001605 |2 |1 |
|111001605 |2 |2 |
|111003425 |1 |1 |
|111003425 |1 |3 |
|111003748 |4 |1 |
|111003748 |1 |1 |
+----------------+

要获取 DataFrame 中的所有唯一行,您可以这样做

unique_df = df.drop_duplicates()

然后要获得第一行和最后一行,您可以调用head()tail()unique_df

first = unique_df.head(1)
last = unique_df.tail(1)

推荐阅读