Pandas DataFrame列规整:指定列仅保留对应值,无值填NaN
频率-通道数据转指定列格式的解决方法
先模拟下你的原始数据结构(假设是两列:Frequency和Channel):
| Frequency | Channel | |-----------|---------| | 100 | 1 | | 100 | 2 | | 200 | 3 | | 300 | 1 |
目标是转成每列对应一个通道,有则显示通道号,无则留空(NaN):
| Frequency | Channel 1 | Channel 2 | Channel 3 | |-----------|-----------|-----------|-----------| | 100 | 1 | 2 | NaN | | 200 | NaN | NaN | 3 | | 300 | 1 | NaN | NaN |
给你两种可行的代码实现:
方法一:用pivot_table快速转换
import pandas as pd # 替换成你的实际数据df df = pd.DataFrame({ 'Frequency': [100, 100, 200, 300], 'Channel': [1, 2, 3, 1] }) # 获取所有唯一通道,生成对应列名 sorted_channels = sorted(df['Channel'].unique()) target_cols = [f'Channel {c}' for c in sorted_channels] # 透视转换,每个频率-通道组合只保留一个值 result = df.pivot_table( index='Frequency', columns='Channel', values='Channel', aggfunc='first' # 同一频率-通道不会重复,用first/last都可以 ).rename(columns=lambda x: f'Channel {x}') # 补全缺失的通道列(如果有的话) for col in target_cols: if col not in result.columns: result[col] = pd.NA # 重置索引并调整列顺序 result = result[target_cols].reset_index()
方法二:分组后遍历填充(更直观)
import pandas as pd # 替换成你的实际数据df df = pd.DataFrame({ 'Frequency': [100, 100, 200, 300], 'Channel': [1, 2, 3, 1] }) # 按频率分组,把每个频率对应的通道存成列表 grouped = df.groupby('Frequency')['Channel'].apply(list).reset_index(name='temp_channels') # 遍历所有通道,生成对应列并赋值 all_channels = sorted(df['Channel'].unique()) for chan in all_channels: grouped[f'Channel {chan}'] = grouped['temp_channels'].apply(lambda x: chan if chan in x else pd.NA) # 删除临时列,得到结果 result = grouped.drop('temp_channels', axis=1)
如果你的通道号是固定范围(比如1到5),可以直接把all_channels改成[1,2,3,4,5],不用从数据里提取。
内容的提问来源于stack exchange,提问作者Emilie Sav
相关产品推荐
相关产品推荐

