我有相当大的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文件。
我对熊猫很陌生,熊猫应该/可以做点什么吗?如果是,请您提示一下相关功能吗?
答案 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_values
和DataFrame.drop_duplicates
替代:
df1 = df.sort_values(['id','date'], ascending=[True, False]).drop_duplicates('id')
在原始列中最后将Series.map
与Series.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