You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何根据小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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 11:20:59