【发布时间】:2016-06-23 15:32:55
【问题描述】:
我想将一个元组分配给我的数据帧的布尔索引切片,如下所示:
>>> import pandas as pd
>>> mydataframe = pd.DataFrame([1,2,3,4,5],columns=['colname'])
>>> mydataframe.loc[mydataframe['colname']>2,'colname'] = (1,2)
期望的输出:
>>> mydataframe
colname
0 1
1 2
2 (1,2,3)
3 (1,2,3)
4 (1,2,3)
但是,pandas 没有将元组分配给每个元素,而是尝试将元组的每个元素分配给切片中的一个元素,并且由于形状不匹配而出错。
实际输出:
ValueError: shape mismatch: value array of shape (2,) could not be broadcast
to indexing result of shape (3,)
我尝试使用 set_value 函数并获得相同的行为:
>>> mydataframe.set_value(mydataframe['colname']>2,'colname', (1,2))
ValueError: shape mismatch: value array of shape (2,) could not be broadcast
to indexing result of shape (3,)
此问题适用于分配给数据框中的单个元素:Add a tuple to a specific cell of a pandas dataframe
有没有一种方法可以在不循环切片中的元素的情况下执行此分配?
编辑: 根据 EdChum 的回答,我还尝试了以下操作,但仍然没有按预期运行:
>>> mydataframe = pd.DataFrame([1,2,3,4,5],columns=['colname'])
>>> assignment_series = pd.Series([(1,2,3)]*np.sum(mydataframe['colname']>2))
>>>> assignment_series
0 (1, 2, 3)
1 (1, 2, 3)
2 (1, 2, 3)
dtype: object
>>> mydataframe.loc[mydataframe['colname']>2,'colname'] = assignment_series
>>> mydataframe
colname
0 1
1 2
2 (1, 2, 3)
3 NaN
4 NaN
编辑2: 抱歉,我误解了 EdChum 的回答。之前的编辑不是他说的,assignment_series 应该和 mydataframe 的长度一样,而不是我上面做的 mydataframe.loc[mydataframe['colname']>2,'colname']。请参阅下面 EdChum 的回答。
【问题讨论】: