【问题标题】:Pandas dataframe sort by date, then assign letters A-ZPandas 数据框按日期排序,然后分配字母 A-Z
【发布时间】:2021-01-28 09:53:29
【问题描述】:

我有一个 pandas 数据框,每行都有日期,我想按第二列分组并对日期进行排序,然后将字母 A 分配给第一个日期,将 B 分配给第二个日期等。请参见下面我被卡住的示例。

import pandas as pd

rng = pd.date_range('2015-02-24', periods=5, freq='T')
names = ['MAK', 'MAK', 'OKA', 'OKA', 'MAK']

df = pd.DataFrame({ 'Date': rng, 'Groups': names })

df

                 Date Groups
0 2015-02-24 00:00:00    MAK
1 2015-02-24 00:01:00    MAK
2 2015-02-24 00:02:00    OKA
3 2015-02-24 00:03:00    OKA
4 2015-02-24 00:04:00    MAK

我想要的结果是:

                 Date Groups  Letter
0 2015-02-24 00:00:00    MAK    A
1 2015-02-24 00:01:00    MAK    B
2 2015-02-24 00:02:00    OKA    A
3 2015-02-24 00:03:00    OKA    B
4 2015-02-24 00:04:00    MAK    C

我想我可以这样定义一个函数:

def assignLetters(row):
    return sort == 'A'

 df['Letter'] = df.groupby('Groups').Date.apply(assignLetters)

任何帮助将不胜感激!也许指引我正确的方向,不知道如何按时间顺序分配字母?

【问题讨论】:

  • 您好,是否可以让 d 的列表更长?如果有超过 26 个日期。它开始枚举 AA,然后是 AB、AC 等?

标签: python pandas dataframe date


【解决方案1】:

将DataFrameGroupBy.rank 与从大写字母创建的字典映射一起使用:

import string

d = dict(enumerate(string.ascii_uppercase, 1))

df['Letter'] = df.groupby('Groups')['Date'].rank('dense').map(d)
print (df)
                 Date Groups Letter
0 2015-02-24 00:00:00    MAK      A
1 2015-02-24 00:01:00    MAK      B
2 2015-02-24 00:02:00    OKA      A
3 2015-02-24 00:03:00    OKA      B
4 2015-02-24 00:04:00    MAK      C

编辑:对于许多组,可以通过自定义函数在 Z 值之后生成 AA,AB..:

from string import ascii_uppercase
import itertools

#https://stackoverflow.com/a/29351603/2901002
def iter_all_strings():
    for size in itertools.count(1):
        for s in itertools.product(ascii_uppercase, repeat=size):
            yield "".join(s)

df['Letter'] = df.groupby('Groups')['Date'].rank('dense')

d = dict(enumerate(itertools.islice(iter_all_strings(), int(df['Letter'].max())), 1))
print (d)
{1: 'A', 2: 'B', 3: 'C'}

df['Letter'] = df['Letter'].map(d)
print (df)
                 Date Groups Letter
0 2015-02-24 00:00:00    MAK      A
1 2015-02-24 00:01:00    MAK      B
2 2015-02-24 00:02:00    OKA      A
3 2015-02-24 00:03:00    OKA      B
4 2015-02-24 00:04:00    MAK      C

【讨论】:

  • 您好,是否可以让 d 的列表更长?如果有超过 26 个日期。它开始枚举 AA,然后是 AB、AC 等?
  • @zape - 给我一些时间来解决。
  • 当然,这就是 excel 计算其列的方式。
  • 嗨,我收到此错误:文件“”,第 1 行,在 d = dict(enumerate(itertools.islice(iter_all_strings(), df ['Letter'].max()))) ValueError: islice() 的停止参数必须为 None 或整数:0
  • @zape - 你现在可以测试了吗?
猜你喜欢
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 2016-04-25
  • 1970-01-01
  • 1970-01-01
  • 2018-11-23
  • 2013-06-29
  • 1970-01-01
相关资源
最近更新 更多