筛选数据集中的多个分配



尝试使用过滤的数据集进行多次调整时,我遇到了一种奇怪的行为,我自己无法解释。我的测试数据:

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中询问。

稍后添加熊猫开发人员的答案。

最新更新