过滤后的数据集中的多个分配

时间:2019-06-11 12:56:50

标签: python pandas

尝试对已过滤的数据集进行多次分配时,遇到一种奇怪的行为,我无法自责。我的测试数据:

import pandas as pd
wert = 2.5
df = pd.DataFrame([['Test', 12, None, None], ['Test2', 15, None, None]], columns=['A','B','C','D'])

我的第一个问题是执行以下代码行:

df.loc[(df['A'] == 'Test'), ['D']] = df['B'] * wert

过滤器仅位于左侧,因此df['B']如何知道在何处分配值?我认为df['B']也应过滤,但这显然不是必需的。因此,我向前迈进了有条件的多重分配,并尝试执行此行:

df.loc[(df['A'] == 'Test'), ['C', 'D']] = [1, df['B'] * wert]

现在我得到一个错误ValueError: cannot set using a list-like indexer with a different length than the value。我的解释是数组df['B'] is longerthan df.loc[df['A']=='Test),但是由于在示例1中可以很好地工作,因此不能做为扩展名。谁能告诉我为什么这不起作用并给我这个错误吗?

2 个答案:

答案 0 :(得分:2)

为什么会这样?

因为在以下情况下,db.test1.aggregate([ {$unwind: "$members"}, {$project:{_id:0}}, { "$group": { "_id": "$status", members:{$addToSet:"$members"} } }, {$out:"test3"} ]) db.test3.find() { "_id" : "inactive", "members" : [ "4", "1", "10", "11" ] } { "_id" : "active", "members" : [ "1", "3", "5", "9" ] } 将引发pandas

  

索引器是一个ndarray或列表,并且长度不匹配。

     

当索引器是布尔数组且   真值的数量等于ValueError的长度。在这   情况下,不会引发异常。

     

source

如果您不想过滤value以匹配,可以使用df.assign()

df['B']

答案 1 :(得分:0)

您的解决方案正在运行,如果使用同一掩码的过滤器列B-对于数据的对齐(不仅是长度),必须具有与过滤后的行相同的索引值:

mask = (df['A'] == 'Test')
df.loc[mask, ['C', 'D']] = [1, df.loc[mask, 'B'] * wert]
print (df)
       A   B     C     D
0   Test  12     1    30
1  Test2  15  None  None

因此,如果按另一个值过滤:

mask = (df['A'] == 'Test2')
df.loc[mask, ['C', 'D']] = [1, df.loc[mask, 'B'] * wert]
print (df)
       A   B  C     D
0   Test  12  1   NaN
1  Test2  15  1  37.5

什么意思:

  

ValueError:无法使用长度与值不同的类似列表的索引器进行设置

老实说,不理解错误,请在pandas github中提问。

稍后再添加来自熊猫开发者的答案。