技术问询:x有重复值时给新列y2赋值及农场厩舍数据转宽表
问题1:当x列存在重复值时,将y列的值分配到y2新列
以下是两种常见场景的解决方案:
场景1:将同一x对应的所有y值合并到y2列(字符串拼接形式)
假设原始数据如下:
| x | y |
|---|---|
| a | 1 |
| a | 2 |
| b | 3 |
用pandas实现:
import pandas as pd df = pd.DataFrame({'x': ['a', 'a', 'b'], 'y': [1, 2, 3]}) # 按x分组,将y值用逗号拼接为字符串 df['y2'] = df.groupby('x')['y'].transform(lambda x: ','.join(map(str, x)))
处理后结果:
| x | y | y2 |
|---|---|---|
| a | 1 | 1,2 |
| a | 2 | 1,2 |
| b | 3 | 3 |
场景2:为每个重复的x分配对应唯一y值到y2
如果需要标记同一x下非首次出现的y值到y2列,可通过分组序号实现:
# 按x分组生成递增序号 df['idx'] = df.groupby('x').cumcount() # 将非首次的y值存入y2,首次则为NA df['y2'] = df.where(df['idx'] > 0, pd.NA)['y']
问题2:将农场厩舍数据从长表转换为宽表
步骤1:创建示例数据
import pandas as pd data = { 'Farm ID': [1, 1, 1, 2, 2, 3], 'Stable type': ['A10', 'A20', 'A30', 'A10', 'A20', 'A10'] } df = pd.DataFrame(data)
步骤2:转换为宽表格式
# 按Farm ID分组,为每个厩舍生成从1开始的序号 df['stable_seq'] = df.groupby('Farm ID').cumcount() + 1 # 重塑数据为宽表,缺失值填充为NA wide_df = df.pivot(index='Farm ID', columns='stable_seq', values='Stable type') # 重命名列名为Stable1、Stable2... wide_df.columns = [f'Stable{col}' for col in wide_df.columns] # 重置索引,让Farm ID作为普通列 wide_df = wide_df.reset_index().fillna(pd.NA)
最终输出结果:
| Farm ID | Stable1 | Stable2 | Stable3 |
|---|---|---|---|
| 1 | A10 | A20 | A30 |
| 2 | A10 | A20 | |
| 3 | A10 |
也可通过pivot_table简化实现:
wide_df = df.pivot_table( index='Farm ID', columns=df.groupby('Farm ID').cumcount() + 1, values='Stable type', aggfunc='first' ).rename(columns=lambda x: f'Stable{x}').reset_index().fillna(pd.NA)
内容的提问来源于stack exchange,提问作者Gijs
相关产品推荐
相关产品推荐

