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中更改了一个值,而不是在oryginaltest\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