熊猫在有条件的情况下将值从一行复制到另一行

时间:2019-09-16 11:55:11

标签: python pandas dataframe

给出以下代码。我想在没有提供任何值的情况下将值从“价格”复制到“新价格”。

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()
# 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
# 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

在版本1中,“ newprice”列中仍然存在Nans,而在版本2中,值已按预期复制。我用相同的蒙版过滤作业的两面,因此应该有一个完全匹配。我的意思是要知道,被分配人的双方都必须提供完全相同数量的结果。那么为什么版本1不起作用?

预先感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

如果两个[]中都有loc,我认为这是一个问题,因此您要分配一个列DataFramepricenewprice的名称不同,所以失败了。

解决方案已删除[],分配给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

分配一列DataFrame是相似的,没有条件(失败):

df.loc[mask, 'newprice'] = df[['price']]

vs分配Series(有效):

df.loc[mask, 'newprice'] = df['price']

答案 1 :(得分:-1)

使用np.where的速度大约是使用mask&的位置的4-5倍,更容易理解。

df['newprice'] = np.where(df['newprice'].isnull(), df['price'], df['newprice'])

输出

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

enter image description here