如何 select 数据框中的特定数据并删除所有其他数据?
How to select specific data in a dataframe and delete all other data?
我有一个数据框,其中有两列;代表一个组(数据类型:int64)和一个日期(数据类型:“0”)。我想提取每组数据的每个子集,其中包含最旧的日期,直到发布新日期为止。必须删除组的所有其他行。
DataFrame 示例:
import pandas as pd
data = {'Col1':[1, 1, 1, 1, 1, 1, 1, 2, 2, 2 ], 'Col2':["2018-01-31", "2018-01-31", "2018-01-31", "2018-01-31", "2019-01-31", "2019-01-31", "2020-01-31", "2018-03-04", "2019-03-04", "2020-03-04"]}
df = pd.DataFrame(data)
print(df)
想要的结果:
data = {'Col1':[1, 1, 1, 1, 2 ], 'Col2':["2018-01-31", "2018-01-31", "2018-01-31", "2018-01-31", "2018-03-04"]}
df = pd.DataFrame(data)
print(df)
我真的希望有人知道如何做到这一点。提前致谢! :)
这与 非常相似,所以我将重用其中的方法,并在处理日期时间类型时做一些小改动。您需要 groupby
和 min
与
df_ = df.merge(pd.to_datetime(df['Col2']).groupby(df['Col1']).min()\
.astype(str).reset_index())
或 groupby.transform
s = pd.to_datetime(df['Col2'])
df_ = df.loc[s.groupby(df['Col1']).transform('min').eq(s)]
转换为日期时间、分组依据和排名:
df['Col2'] = pd.to_datetime(df['Col2'])
df['rank'] = df.groupby('Col1')['Col2'].rank(ascending=True,method='min')
df
Col1 Col2 rank
0 1 2018-01-31 1.0
1 1 2018-01-31 1.0
2 1 2018-01-31 1.0
3 1 2018-01-31 1.0
4 1 2019-01-31 5.0
5 1 2019-01-31 5.0
6 1 2020-01-31 7.0
7 2 2018-03-04 1.0
8 2 2019-03-04 2.0
9 2 2020-03-04 3.0
您只想保留排名 1:
df = df.loc[df['rank']==1]
我有一个数据框,其中有两列;代表一个组(数据类型:int64)和一个日期(数据类型:“0”)。我想提取每组数据的每个子集,其中包含最旧的日期,直到发布新日期为止。必须删除组的所有其他行。
DataFrame 示例:
import pandas as pd
data = {'Col1':[1, 1, 1, 1, 1, 1, 1, 2, 2, 2 ], 'Col2':["2018-01-31", "2018-01-31", "2018-01-31", "2018-01-31", "2019-01-31", "2019-01-31", "2020-01-31", "2018-03-04", "2019-03-04", "2020-03-04"]}
df = pd.DataFrame(data)
print(df)
想要的结果:
data = {'Col1':[1, 1, 1, 1, 2 ], 'Col2':["2018-01-31", "2018-01-31", "2018-01-31", "2018-01-31", "2018-03-04"]}
df = pd.DataFrame(data)
print(df)
我真的希望有人知道如何做到这一点。提前致谢! :)
这与 groupby
和 min
与
df_ = df.merge(pd.to_datetime(df['Col2']).groupby(df['Col1']).min()\
.astype(str).reset_index())
或 groupby.transform
s = pd.to_datetime(df['Col2'])
df_ = df.loc[s.groupby(df['Col1']).transform('min').eq(s)]
转换为日期时间、分组依据和排名:
df['Col2'] = pd.to_datetime(df['Col2'])
df['rank'] = df.groupby('Col1')['Col2'].rank(ascending=True,method='min')
df
Col1 Col2 rank
0 1 2018-01-31 1.0
1 1 2018-01-31 1.0
2 1 2018-01-31 1.0
3 1 2018-01-31 1.0
4 1 2019-01-31 5.0
5 1 2019-01-31 5.0
6 1 2020-01-31 7.0
7 2 2018-03-04 1.0
8 2 2019-03-04 2.0
9 2 2020-03-04 3.0
您只想保留排名 1:
df = df.loc[df['rank']==1]