Python 为DataFrame列的单行赋值

Python 为DataFrame列的单行赋值,python,pandas,Python,Pandas,我试图在数据帧中的一列的单行中重新分配一个值 import pandas as pd import numpy as np 以下是数据帧: test_df = pd.DataFrame({'range_total' : [3000,3000,3000,3000,3000,3000,0,2000,2000,1000,1000,1000,1000,1000,1000], 'high_boundary' : [6,6,6,6,6,6,7,9,9,15,15,15,15,15,15],

我试图在数据帧中的一列的单行中重新分配一个值

import pandas as pd
import numpy as np
以下是数据帧:

test_df = pd.DataFrame({'range_total' : [3000,3000,3000,3000,3000,3000,0,2000,2000,1000,1000,1000,1000,1000,1000],
    'high_boundary' : [6,6,6,6,6,6,7,9,9,15,15,15,15,15,15],
    'dist_num' : [1197, 142, 142, 1197, 159, 159, 0, 1000, 1000, 398, 50, 50, 398, 50, 50],
    'round_num_sum' : [2996, 2996, 2996, 2996, 2996, 2996, 0, 2000, 2000, 996, 996, 996, 996, 996, 996]})
在我的代码中,我为
high_boundary
的每个值对数据帧进行子集,并找到
test_df
的索引,对应于
dist_num
的最大值(如果并列,则选择第一个)。对于本例,我将索引设置为:

sub_idx = 0 
我可以使用以下(和其他类似版本)代码访问该值:

这将返回:

1197
但分配新值失败:

test_df.ix[(test_df.high_boundary == 6), "dist_num"][sub_idx] = 42
test_df.ix[(test_df.high_boundary == 6), "dist_num"][sub_idx]
它仍然返回:

1197 
但是:

返回:

0    42
1    42 
2    42
3    42
4    42
5    42
Name: dist_num, dtype: int64

谢谢你的帮助。这是我的第一篇帖子,因为我一直都在寻找我需要的东西。我使用的是0.14.0版。

有时您可以获得原始数据帧的副本
test\u df

尤其是使用
[…][…]

所以您在copy中更改了一个值,而不是在oryginal
test\u df

请尝试以下示例:

test_df["dist_num"].ix(test_df.high_boundary == 6)[sub_idx] = 0

你们应该会得到预期的结果。

过去也有类似的问题。建议您在以下位置使用示例:

特别是该节 我会帮助你的

编辑上的解释是,如果使用df[]]构造进行链切片,则通常会切片到序列1,然后切片到值。pandas无法跟踪原始筛选器以允许您回写到切片


简短回答尝试使用“.loc”这样的单个运算符来执行您打算分配给的选择。

几年后重新查看此代码时,我发现上面发布的解决方案现在提供了一个错误(使用Pandas版本0.20.1和Python 2.7.13):
TypeError:“Series”对象是可变的,因此不能对其进行哈希处理
。如果其他人有这个问题,我在下面添加了一个解决方案

要更新
pd.DataFrame
子集的单个元素,找到子集中的索引值,然后使用与所需行对应的索引来选择要更新的元素

sub_idx = 0

indices = test_df.loc[test_df.high_boundary == 6,"dist_num"].index
print(test_df.loc[indices[sub_idx],"dist_num"])
# 1197
test_df.loc[indices[sub_idx],"dist_num"] = 0 

print(test_df.loc[indices[sub_idx],"dist_num"])
# 0

请阅读以了解为什么您的代码会以这种方式运行,本质上您是在执行链索引,这可能会起作用。这是不推荐的,请遵循链接中的建议。这确实起到了作用(谢谢!),但给我提出了另一个问题:
.ix()
符号与
.ix[]
符号如何“解决”链接问题。我没有在@EdChum或@Joop链接的页面上找到它,谷歌快速搜索该语法,没有透露任何信息。谢谢。
.ix()
是特殊功能,
.ix[]
只是切片。使用该函数,您可以执行
.ix(…,copy=False)
但无法执行切片操作。函数可以给你
索引器
作为结果,切片给你
系列
-打印
类型(.ix())
类型(.ix[])
@Joop和@furas再次处理这个项目,现在我得到了
类型错误:'Series'对象是可变的,因此它们可以被散列。
当运行这个:
测试时[“dist_num”].ix(test_df.high_boundary==6)[sub_idx]=test_df[“dist_num”].ix(test_df.high_boundary==6)[sub_idx]+5
test_df["dist_num"].ix(test_df.high_boundary == 6)[sub_idx] = 0
sub_idx = 0

indices = test_df.loc[test_df.high_boundary == 6,"dist_num"].index
print(test_df.loc[indices[sub_idx],"dist_num"])
# 1197
test_df.loc[indices[sub_idx],"dist_num"] = 0 

print(test_df.loc[indices[sub_idx],"dist_num"])
# 0