查找每列的最新行

时间:2019-03-05 12:49:02

标签: python pandas

我有相当大的csv表(大约200万行):

|  id  |     status         |      date           |
|------|--------------------|---------------------|
|  55  |    'blah blah'     |  29-02-12 21:00:00  |
|  55  |    'yoyoyoyoyo'    |  29-02-12 22:00:00  |
|  44  |    'qwertyuiop'    |  29-02-12 21:30:00  |

我想要的输出是每个ID获得最新的行以及每个ID获得的行数:

|  id  |     status         |      last_date      |  amount |
|------|--------------------|---------------------|---------|
|  55  |    'yoyoyoyoyo'    |  29-02-12 22:00:00  |    2    |
|  44  |    'qwertyuiop'    |  29-02-12 21:30:00  |    1    |

并将所需的输出保存到另一个csv文件。

我对熊猫很陌生,熊猫应该/可以做点什么吗?如果是,请您提示一下相关功能吗?

2 个答案:

答案 0 :(得分:3)

首先在必要时转换列to_datetime,然后通过DataFrameGroupBy.idxmax获取索引并通过loc选择:

df['date'] = pd.to_datetime(df['date'])

df1 = df.loc[df.groupby('id', sort=False)['date'].idxmax()]

DataFrame.sort_valuesDataFrame.drop_duplicates替代:

df1 = df.sort_values(['id','date'], ascending=[True, False]).drop_duplicates('id')

在原始列中最后将Series.mapSeries.value_counts一起使用:

df1['amount'] = df1['id'].map(df['id'].value_counts())
print (df1)
   id        status                date  amount
1  55  'yoyoyoyoyo' 2012-02-29 22:00:00       2
2  44  'qwertyuiop' 2012-02-29 21:30:00       1

答案 1 :(得分:1)

另一种方法是将.transform.max.size一起使用两次,如下所示:


# Convert our date columns to datetime format
df['date'] = pd.to_datetime(df.date)

# Create the amount and last_date column with transform 
df['amount']= df.groupby('id').id.transform('size')
df['last_date'] = df.groupby('id').date.transform('max')

print(df)
   id      status                date  amount           last_date
0  55   blah blah 2012-02-29 21:00:00       2 2012-02-29 22:00:00
1  55  yoyoyoyoyo 2012-02-29 22:00:00       2 2012-02-29 22:00:00
2  44  qwertyuiop 2012-02-29 21:30:00       1 2012-02-29 21:30:00

# Filter the rows we need and drop date column we dont need anymore
df = df[df.date == df.last_date].drop('date', axis=1)

print(df)
   id      status  amount           last_date
1  55  yoyoyoyoyo       2 2012-02-29 22:00:00
2  44  qwertyuiop       1 2012-02-29 21:30:00