如何基于python数据框中的两列组合创建唯一的代码

时间:2020-08-24 11:32:11

标签: python python-3.x

我正在尝试基于两列的组合来创建唯一的代码。任何帮助都将非常有用。谢谢。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Globalization;

namespace ConsoleApplication166
{
    class Program
    {
        static void Main(string[] args)
        {
            Context db = new Context();
            string id = "abc";

            var results = db.Conteudo
                .Where(x => (x.nomeAl == id) && (x.Data_cont.Day == DateTime.Now.Day))
                .OrderBy(x => x.Data_cont)
                .Select(x => new { max_valor = x.max_valor, date = x.Data_cont.ToString("hh:mm") })
                .ToList();
        }
    }
    public class Context
    {
        public List<Conteudo> Conteudo { get; set; }
    }
    public class Conteudo
    {
        public string nomeAl { get; set; }
        public DateTime Data_cont { get; set; }
        public string max_valor { get; set; }
    }
 
}

输入:

import pandas as pd
data = [['ajay','AL'],['ajay','AB'],['ajay','AL'],['Alex','Ac'],['Alex','Ay'],['Alex','Ac'],['Alex','Ac'],['Bob','Ay'],['Clarke','cv']]
df = pd.DataFrame(data,columns=['Name','Cat'],dtype=float)

输出:

    Name Cat
0    ajay  AL
1    ajay  AB
2    ajay  AL
3    Alex  Ac
4    Alex  Ay
5    Alex  Ac
6    Alex  Ac
7     Bob  Ay
8  Clarke  cv

谢谢。

2 个答案:

答案 0 :(得分:1)

您可以像这样简单地用uuid创建一列:

import uuid    
df['code'] = df.apply(lambda x: uuid.uuid1(), axis=1)

或者如果您想合并两列:

df['code'] = df.apply(lambda row: row.Name + row.Cat, axis=1)

答案 1 :(得分:1)

我希望我对您的问题理解正确,此脚本将创建列code,其中前两个字符来自列'Name',然后基于'Cat'列编号:

from itertools import count
from functools import lru_cache
from collections import defaultdict

d = defaultdict(lambda: count(1))

@lru_cache(maxsize=None)
def get_num(n, c):
    return next(d[n])

df['code'] = df.apply(lambda x: '{}_{}'.format(x['Name'][:2].upper(), get_num(x['Name'], x['Cat'])), axis=1)
print(df)

打印:

     Name Cat  code
0    ajay  AL  AJ_1
1    ajay  AB  AJ_2
2    ajay  AL  AJ_1
3    Alex  Ac  AL_1
4    Alex  Ay  AL_2
5    Alex  Ac  AL_1
6    Alex  Ac  AL_1
7     Bob  Ay  BO_1
8  Clarke  cv  CL_1