尝试对已过滤的数据集进行多次分配时,遇到一种奇怪的行为,我无法自责。我的测试数据:
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中可以很好地工作,因此不能做为扩展名。谁能告诉我为什么这不起作用并给我这个错误吗?
答案 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
的长度。在这 情况下,不会引发异常。
如果您不想过滤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中提问。
稍后再添加来自熊猫开发者的答案。