我需要转换一个表,看起来像这样:
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])