Pandas中从已有DataFrame派生新DataFrame的赋值难题
嗨,我完全懂你碰到的麻烦——空的DataFrame因为没有行数据,确实没法直接通过索引去赋值单元格。给你几个实用的解决办法,都是我平时处理这类场景常用的:
方法1:先收集数据列表,最后一次性生成DataFrame
这种方法效率最高,尤其是数据量较大的时候,避免了循环里频繁操作DataFrame的开销。
import pandas as pd # 假设你的df1示例数据 df1 = pd.DataFrame({'A': [1,2,3], 'B': [4,5,6]}) # 初始化空列表存储每行数据 data_list = [] for idx, row in df1.iterrows(): # 这里根据你的逻辑计算Z1-Z4的值,举个简单例子 z1 = row['A'] + 1 z2 = row['B'] * 2 z3 = row['A'] + row['B'] z4 = row['A'] * row['B'] # 把当前行的结果以字典形式加入列表(字典键对应df2的列名) data_list.append({'Z1': z1, 'Z2': z2, 'Z3': z3, 'Z4': z4}) # 最后把列表转成目标df2 df2 = pd.DataFrame(data_list)
方法2:用pd.concat逐行拼接(替代已弃用的append)
如果你一定要逐步构建df2,可以每次生成单行的小DataFrame,再用concat拼接到主df2上:
import pandas as pd df1 = pd.DataFrame({'A': [1,2,3], 'B': [4,5,6]}) # 先创建带列名的空df2 df2 = pd.DataFrame(columns=['Z1', 'Z2', 'Z3', 'Z4']) for idx, row in df1.iterrows(): z1 = row['A'] + 1 z2 = row['B'] * 2 z3 = row['A'] + row['B'] z4 = row['A'] * row['B'] # 生成单行DataFrame new_row = pd.DataFrame({'Z1': [z1], 'Z2': [z2], 'Z3': [z3], 'Z4': [z4]}) # 拼接到df2,ignore_index=True用来重置索引避免重复 df2 = pd.concat([df2, new_row], ignore_index=True)
方法3:预先设置df2的行长度再赋值
如果你确定df2的行数和df1一致,可以先创建对应行数的空df2,再通过索引赋值:
import pandas as pd df1 = pd.DataFrame({'A': [1,2,3], 'B': [4,5,6]}) # 创建和df1行数相同的空df2,指定列名和索引范围 df2 = pd.DataFrame(index=range(len(df1)), columns=['Z1', 'Z2', 'Z3', 'Z4']) for idx, row in df1.iterrows(): # 用loc通过索引+列名直接赋值 df2.loc[idx, 'Z1'] = row['A'] + 1 df2.loc[idx, 'Z2'] = row['B'] * 2 df2.loc[idx, 'Z3'] = row['A'] + row['B'] df2.loc[idx, 'Z4'] = row['A'] * row['B']
内容的提问来源于stack exchange,提问作者Rookie_123
相关产品推荐
相关产品推荐

