如何根据小DataFrame的项规则生成含1/-1/0映射的新DataFrame
解决方案
可以用Pandas通过以下几种方式实现需求,这里提供三种不同思路的方法:
方法一:循环赋值(直观易懂,适合小数据集)
先创建全0的目标DataFrame,再逐行设置对应值:
import pandas as pd # 原数据 df = pd.DataFrame({ 'i': ['a', 'a', 'b'], 'j': ['b', 'c', 'c'] }) # 获取所有唯一元素作为新列名,排序后与示例一致 unique_cols = sorted(pd.concat([df['i'], df['j']]).unique()) # 初始化全0的结果DataFrame result = pd.DataFrame(0, index=df.index, columns=unique_cols) # 逐行赋值:i列对应1,j列对应-1 for idx, row in df.iterrows(): result.loc[idx, row['i']] = 1 result.loc[idx, row['j']] = -1 print(result)
方法二:apply行转换(简洁写法)
利用apply对每行进行转换操作:
import pandas as pd df = pd.DataFrame({ 'i': ['a', 'a', 'b'], 'j': ['b', 'c', 'c'] }) unique_cols = sorted(pd.concat([df['i'], df['j']]).unique()) def process_row(row): # 初始化全0行数据 row_data = [0]*len(unique_cols) # 给i、j对应位置赋值 row_data[unique_cols.index(row['i'])] = 1 row_data[unique_cols.index(row['j'])] = -1 return pd.Series(row_data, index=unique_cols) result = df.apply(process_row, axis=1) print(result)
方法三:向量化操作(高效,适合大数据集)
通过get_dummies生成哑变量后合并计算,避免循环提升效率:
import pandas as pd df = pd.DataFrame({ 'i': ['a', 'a', 'b'], 'j': ['b', 'c', 'c'] }) # 生成i列的哑变量(对应1)和j列的哑变量(对应-1) i_dummies = pd.get_dummies(df['i']) j_dummies = pd.get_dummies(df['j']) * -1 # 合并两部分数据,补全所有列并按指定顺序排列 unique_cols = sorted(pd.concat([df['i'], df['j']]).unique()) result = i_dummies.add(j_dummies, fill_value=0)[unique_cols] print(result)
三种方法最终都会输出目标结构的DataFrame:
a b c 0 1 -1 0 1 1 0 -1 2 0 1 -1
内容的提问来源于stack exchange,提问作者moni
相关产品推荐
相关产品推荐

