我有一个dataframe 'df‘,它包括:
col1 = datetime[64]
col2 = object
col3 = object
col4 = object我想按“col1”对数据进行排序。那么我想按'col2‘分组。最后,我想在该分组中创建一个序数值(1,2,3),按“col2”进行排序,并按“col1”排序。如果按“col2”分组中有4行,则在这个新列中,这些行的值将为1,2,3,4。
我知道熊猫有“等级”,我可以用
df['newcol'] = df.groupby(['col2'])['col1'].rank()但是这并不能给出原始的dataframe列,它的序号值只有1,2,3在分组中?
发布于 2016-04-29 00:31:17
你想要实现这样的目标吗?如果没有样本数据和期望的结果,就很难判断。
random.seed(0)
df = pd.DataFrame({col: [random.choice(list('abc')) for i in range(10)] for col in list('ABC')})
df['timestamp'] = pd.date_range('2016-1-1', periods=len(df))
df.sort_values('timestamp', inplace=True)
df['rank'] = \
df.groupby('A')['B'].transform(lambda group: group.astype('category').cat.codes + 1)
>>> df
A B C timestamp rank
0 c c a 2016-01-01 2
1 c b c 2016-01-02 1
2 b a c 2016-01-03 1
3 a c c 2016-01-04 1
4 b b b 2016-01-05 2
5 b a a 2016-01-06 1
6 c c b 2016-01-07 2
7 a c b 2016-01-08 1
8 b c c 2016-01-09 3
9 b c c 2016-01-10 3发布于 2016-04-28 23:19:58
试着用这个:
>> df.sort_values(by='col1').groupby('col2')这将首先按照col1对DF进行排序,然后按col2进行分组。结果将是一个GroupBy对象。
如果还希望在每个组中有行数,则可以尝试如下:
>> grouped = df.sort_values(by='col1').groupby('col2')
>> grouped.count()我希望这能帮到你!
发布于 2020-01-14 05:30:40
有一种熊猫groupby方法可以做OP想要做的事情(我认为):
df.sort_values("col1", inplace = True)
df["rank"] = df.groupby("col2").cumcount() + 1不过,在这里使用MultiIndex可能更有用:
df.set_index(["col1", "col2"], inplace = True)
df["rank"] = df.groupby(level = "col2").cumcount() + 1为了使事情变得更漂亮(按"col2“和”col1“排序的行):
df.sort_values(by=["col2", "col1"], inplace = True)https://stackoverflow.com/questions/36927013
复制相似问题