如何通过引用另外两列来在Python Dataframe中创建新列?

时间:2016-09-22 18:43:07

标签: python pandas dataframe

我的数据框看起来像这样:

df = pd.DataFrame({'Name':['a','a','a','a','b','b','b'], 'Year':[1999,1999,1999,2000,1999,2000,2000], 'Name_id':[1,1,1,1,2,2,2]})

  Name  Name_id  Year
0    a        1  1999
1    a        1  1999
2    a        1  1999
3    a        1  2000
4    b        2  1999
5    b        2  2000
6    b        2  2000

我想要的是一个新专栏' yr_name_id'为每个唯一的Name_id-Year组合增加,然后每个新的Name_id重新开始。

  Name  Name_id  Year  yr_name_id
0    a        1  1999           1
1    a        1  1999           1
2    a        1  1999           1
3    a        1  2000           2
4    b        2  1999           1
5    b        2  2000           2
6    b        2  2000           2

我尝试过各种各样的事情,看了herehere以及关于groupby和枚举的几个帖子。

首先,我尝试在组合Name_id和Year之后创建一个唯一的字典,然后使用map来分配值,但是当我尝试通过以下方式将Name_id和Year组合为字符串时:

df['yr_name_id'] = str(df['Name_id']) + str(df['Year'])

新专栏具有0 0 1\n1 1\n2 1\n3 1\n4 2\n5 2...的非唯一语法,我并不十分理解。

我认为我需要帮助lambda的更有前途的方法是使用groupby

df['yr_name_id'] =  df.groupby(['Name_id', 'Year'])['Name_id'].transform(lambda x: )#unsure from this point

我对lambda非常不熟悉,所以对我如何做到这一点的任何指导都将不胜感激。

2 个答案:

答案 0 :(得分:1)

IIUC你可以这样做:

In [99]: df['yr_name_id'] = pd.Categorical(pd.factorize(df['Name_id'].astype(str) + '-' + df['Year'].astype(str))[0] + 1)

In [100]: df
Out[100]:
  Name  Name_id  Year yr_name_id
0    a        1  1999          1
1    a        1  1999          1
2    a        1  1999          1
3    a        1  2000          2
4    b        2  1999          3
5    b        2  2000          4
6    b        2  2000          4

In [101]: df.dtypes
Out[101]:
Name            object
Name_id          int64
Year             int64
yr_name_id    category
dtype: object

但是查看您想要的DF,看起来您只想对Year列进行分类, Name_id + Year的组合

In [102]: df['yr_name_id'] = pd.Categorical(pd.factorize(df.Year)[0] + 1)

In [103]: df
Out[103]:
  Name  Name_id  Year yr_name_id
0    a        1  1999          1
1    a        1  1999          1
2    a        1  1999          1
3    a        1  2000          2
4    b        2  1999          1
5    b        2  2000          2
6    b        2  2000          2

In [104]: df.dtypes
Out[104]:
Name            object
Name_id          int64
Year             int64
yr_name_id    category
dtype: object

答案 1 :(得分:0)

使用itertools.count

from itertools import count

counter = count(1)
df['yr_name_id'] = (df.groupby(['Name_id', 'Year'])['Name_id']
                      .transform(lambda x: next(counter)))

输出:

  Name  Name_id  Year  yr_name_id
0    a        1  1999           1
1    a        1  1999           1
2    a        1  1999           1
3    a        1  2000           2
4    b        2  1999           3
5    b        2  2000           4
6    b        2  2000           4