尝试使用过滤的数据集进行多次调整时,我遇到了一种奇怪的行为,我自己无法解释。我的测试数据:
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 中工作正常,因此这不能是扩展。谁能告诉我为什么这不起作用并给我这个错误?
为什么会这样?
因为pandas
会在以下情况下引发ValueError
:
索引器是 NDARRAY 或列表,长度不匹配。
当索引器是布尔数组并且 真值的数量等于
value
的长度。在此 的情况下,没有提出例外。源
如果您不想筛选df['B']
以匹配以下内容,可以使用df.assign()
:
df.loc[(df['A'] == 'Test')].assign(C=1, D=df['B'] * wert)
过滤器列由相同的掩码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
什么意思:
值错误:无法使用长度与值不同的类似列表的索引器进行设置
老实说,不理解错误,所以在熊猫github中询问。
稍后添加熊猫开发人员的答案。