Pandas:如何用特定系列中的相同列值替换列值的子集?

问题描述 投票:0回答:1

我正在编写一个 Pandas 脚本来对 Excel 文件执行数据操作。首先,我将两张表加载到数据框中。一个是原始数据

df
,第二个是一张详细说明需要在原始数据中进行替换的表格
replace

脚本需要为

df
的每一行执行两件事。

  1. 'Name'
    df
    的每个实例替换为
    'NameReplace'
    (工作)

  2. 对于

    df
    中的相同行,将列的切片(由列表指定)替换为
    replace

    中同一列切片中的值

我当前实现的可重现的最小示例:

import pandas

df = pandas.DataFrame([["John", None, None],["Phil", None, None],["John", None, None],["Bob", None, None]], columns=["Name", "Age", "Height"])
replace = pandas.DataFrame([["John", "Dom", 25, 175],["Phil", "Kevin", 56, 145],["Bob", "Michael", 33, 180]], columns=["Name", "NameReplace", "Age", "Height"])

detailsList = ["Age", "Height"]

for i, row in replace.iterrows():
    df.loc[df['Name'] == row['Name'], 'Name'] = row['NameReplace']
    df.loc[df['Name'] == row['NameReplace'], detailsList] = row[detailsList]

print(df)

步骤 1) 正在使用此实现,但

detailsList
中的
df
列未填充。
目前的输出是

      Name  Age Height
0      Dom  NaN    NaN
1    Kevin  NaN    NaN
2      Dom  NaN    NaN
3  Michael  NaN    NaN

期望的输出是

      Name  Age Height
0      Dom  25    175
1    Kevin  56    145
2      Dom  25    175
3  Michael  33    180

我已经尝试了一段时间了,但似乎没有取得任何进展。我也不太明白为什么这不起作用,所以任何见解都将受到额外的赞赏!

注意:使用

detailsList

 来指定列的切片是必要的,因为在实际的解决方案中,我只对完整数据帧的特定切片进行操作,这与我给出的示例不同。

python pandas data-manipulation
1个回答
0
投票
问题在于 pandas 尝试将一系列分配给整个数据框的方式。无论如何,这里有一个简单的修复,可以实现预期的行为,利用 pandas 在使用 numpy 数组而不是序列进行分配时执行正确的操作。

for i, row in replace.iterrows(): df.loc[df['Name'] == row['Name'], 'Name'] = row['NameReplace'] df.loc[df['Name'] == row['NameReplace'], detailsList] = row[detailsList].values print(df.loc[df['Name'] == row['NameReplace'], detailsList])
    
© www.soinside.com 2019 - 2024. All rights reserved.