【问题标题】:How to generate id number using python?如何使用python生成身份证号码?
【发布时间】:2019-10-10 16:23:34
【问题描述】:

我有一个数据框。我想为每个人创建一个唯一的 ID 号,并根据人员和日期(每周)创建一个列。

import pandas as pd
df = pd.DataFrame({ 'name':['one','one','two','two','two','three','four'],
                     'date':['2019-05-01','2019-05-08','2019-05-01','2019-05-08','2019-05-15','2019-05-01','2019-05-15'],
                    "a":range(7)})
df['date'] = pd.to_datetime(df['date'],yearfirst=True)
df = df.sort_values(['name','date'])
print(df)

这是数据:

    name       date  a
6   four 2019-05-15  6
0    one 2019-05-01  0
1    one 2019-05-08  1
5  three 2019-05-01  5
2    two 2019-05-01  2
3    two 2019-05-08  3
4    two 2019-05-15  4

预期结果是

    name       date  a    id    week
6   four 2019-05-15  6     1    3
0    one 2019-05-01  0     2    1
1    one 2019-05-08  1     2    2
5  three 2019-05-01  5     3    1 
2    two 2019-05-01  2     4    1
3    two 2019-05-08  3     4    2
4    two 2019-05-15  4     4    3

如何获得“id”和“week”? 谢谢!

【问题讨论】:

  • 请提出两个单独的问题,因为每列必须独立生成。
  • 获取“id”的方法如下:stackoverflow.com/questions/15072626/…
  • 您还没有解释“周”的含义,但我假设您指的是该日期的运行周。试试np.ceil(df.date.dt.day / 7)
  • 谢谢!下次我会分开提问。而“周”的意思正是我的意思。

标签: python pandas


【解决方案1】:

像@cs95 评论使用GroupBy.ngroup7numpy.ceil 划分天数:

df["Id"] = df.groupby("name").ngroup() + 1
df['week'] = np.ceil(df.date.dt.day / 7).astype(int)
print (df)

    name       date  a  Id  week
6   four 2019-05-15  6   1     3
0    one 2019-05-01  0   2     1
1    one 2019-05-08  1   2     2
5  three 2019-05-01  5   3     1
2    two 2019-05-01  2   4     1
3    two 2019-05-08  3   4     2
4    two 2019-05-15  4   4     3

或者:

df["Id"] = df.groupby("name").ngroup() + 1
df['week'] =  df.groupby("date").ngroup() + 1
print (df)

    name       date  a  Id  week
6   four 2019-05-15  6   1     3
0    one 2019-05-01  0   2     1
1    one 2019-05-08  1   2     2
5  three 2019-05-01  5   3     1
2    two 2019-05-01  2   4     1
3    two 2019-05-08  3   4     2
4    two 2019-05-15  4   4     3

【讨论】:

    【解决方案2】:

    我使用cumsum 获取df['id']groupby df.date 获取df['week']

    df['id'] = df.name.ne(df.name.shift()).cumsum()
    df['week'] = df.date.groupby(df.date).ngroup() + 1
    
    
    Out[408]:
        name       date  a  id  week
    6   four 2019-05-15  6   1     3
    0    one 2019-05-01  0   2     1
    1    one 2019-05-08  1   2     2
    5  three 2019-05-01  5   3     1
    2    two 2019-05-01  2   4     1
    3    two 2019-05-08  3   4     2
    4    two 2019-05-15  4   4     3
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-11
      • 1970-01-01
      • 2020-09-02
      • 1970-01-01
      • 2010-09-07
      • 2020-07-11
      • 1970-01-01
      • 2020-07-16
      相关资源
      最近更新 更多