Pandas - 根据条件将值从一行复制到另一行

hig*_*ife 5 python dataframe pandas

给出的是以下代码。当没有提供值时,我想将值从“price”复制到“newprice”。

import pandas as pd
articles = {"number": ["111", "222", "333"],
          "price": [12.46, 33.66, 43.35],
          "name": ["Article1", "Article2", "Article3"],
          "newprice": [11.24, None, None]}
df = pd.DataFrame(articles)
print(df)

# Select empty entries
mask = df['newprice'].isnull()
Run Code Online (Sandbox Code Playgroud)
# Version 1 (not working)
df.loc[mask, ['newprice']] = df.loc[mask, ['price']]
print(df)

# Output
#  number  price      name  newprice
# 0    111  12.46  Article1     11.24
# 1    222  33.66  Article2       NaN
# 2    333  43.35  Article3       NaN
Run Code Online (Sandbox Code Playgroud)
# Version 2 (working)
df.loc[mask, ['newprice']] = df['price']
print(df)

# Output
#  number  price      name  newprice
# 0    111  12.46  Article1     11.24
# 1    222  33.66  Article2     33.66
# 2    333  43.35  Article3     43.35
Run Code Online (Sandbox Code Playgroud)

在版本 1 中,“newprice”列中仍然有 Nan,而在版本 2 中,值按预期复制。我用相同的掩码过滤分配的两侧,因此应该完全匹配。我的意思是知道作业双方必须提供完全相同数量的结果。那么为什么版本 1 不起作用呢?

在此先感谢您的帮助。

jez*_*ael 3

[]我认为如果两者都有问题loc,因此您分配一列DataFramepricevs名称不同newprice,所以失败。

解决方案是删除[]分配Series

df.loc[mask, 'newprice'] = df.loc[mask, 'price']
print(df)
  number  price      name  newprice
0    111  12.46  Article1     11.24
1    222  33.66  Article2     33.66
2    333  43.35  Article3     43.35
Run Code Online (Sandbox Code Playgroud)

分配一列DataFrame与无条件类似(失败):

df.loc[mask, 'newprice'] = df[['price']]
Run Code Online (Sandbox Code Playgroud)

与分配Series(工作):

df.loc[mask, 'newprice'] = df['price']
Run Code Online (Sandbox Code Playgroud)