连接具有相同ID的记录的值| Pandas



我需要转换一个表,看起来像这样:

ID    |  Year  |  Code
----------------------
1     |  2020  |    a
1     |  2019  |    b
1     |  2018  |    c
2     |  2019  |    d
2     |  2018  |    e
2     |  2017  |    f
3     |  2020  |    g
3     |  2018  |    h

到一个具有'Sequence'列的表,该列包括在其下具有相同'ID'的所有记录的'Year'值的串联,加上当前'Code'。

最终的表应该是这样的:

ID    |  Year  |  Code  | Sequence
------------------------------------------
1     |  2020  |    a   | 2018x2019x2020_a
1     |  2019  |    b   | 2018x2019_b
1     |  2018  |    c   | 2018_c
2     |  2019  |    d   | 2017x2018x2019_d
2     |  2018  |    e   | 2017x2018_e
2     |  2017  |    f   | 2017_f
3     |  2020  |    g   | 2018x2020_g
3     |  2018  |    h   | 2018_h

目前,我有这段代码,连接所有的'年'值与相同的'ID',但我希望它只包括当前记录以下的记录。我不知道该怎么做。

df['Sequence'] = (df.astype({'Year': str})
.groupby('ID')['Year']
.transform(lambda x: 'x'.join(x[::-1]))
.add('_' + df['Code'].astype(str)))

谢谢你的帮助。

您可以尝试使用cumsum()对列表进行groupby:

示例:

import pandas as pd
df = pd.DataFrame({'ID': {1: '1', 2: '1', 3: '1', 4: '2', 5: '2', 6: '2', 7: '3', 8: '3'}, 'Year': {1: 2020.0,  2: 2019.0,  3: 2018.0,  4: 2019.0,  5: 2018.0,  6: 2017.0,  7: 2020.0,  8: 2018.0}, 'Code': {1: 'a', 2: 'b', 3: 'c', 4: 'd', 5: 'e', 6: 'f', 7: 'g', 8: 'h'}})

代码:

df = df.sort_values(['ID', 'Year'], ascending=True)
df['Year'] = df['Year'].astype(int).astype(str)
df['Sequence'] = df.groupby(['ID'])['Year'].apply(lambda x: x.map(lambda x: [x]).cumsum()).str.join('x') + '_' + df['Code']
df = df.sort_values(['ID', 'Year'], ascending=[True, False])

最新更新