如何更改熊猫数据框中的单个索引值?

Posted

技术标签:

【中文标题】如何更改熊猫数据框中的单个索引值?【英文标题】:How do I change a single index value in pandas dataframe? 【发布时间】:2017-03-18 14:21:57 【问题描述】:
energy.loc['Republic of Korea']

我想将 index 的值从“Republic of Korea”更改为“South Korea”。 但是数据框太大,不可能更改每个索引值。如何只更改这一个值?

【问题讨论】:

您的问题不清楚,您想更改'Republic of Korea' 的所有实例,或者您想知道如何更新大量不同的索引值?请发布一个有代表性的例子,包括你的代码和想要的结果,除了你可以做df.index.set_value(df.index, 'Republic of Korea', 'South Korea') 【参考方案1】:

我们可以使用rename 函数来改变行索引或列名。这是一个例子,

假设数据框如下所示,

       student_id     marks
index
  1        12          33
  2        23          98
将索引 1 更改为 5

我们将使用 axis = 0 表示行

df.rename( 1 : 5 , axis=0)

df 指的是数据框变量。所以,输出会是这样的

       student_id     marks
index
  5        12          33
  2        23          98
更改列名

我们将不得不使用axis = 1

df.rename( "marks" : "student_marks" , axis=1)

所以,改变的数据框是

       student_id     student_marks
index
  5        12              33
  2        23              98

【讨论】:

【参考方案2】:

这似乎也有效:

energy.index.values[energy.index.tolist().index('Republic of Korea')] = 'South Korea'

不知道这是推荐还是不鼓励。

【讨论】:

【参考方案3】:

试试这个

df.rename(index='Republic of Korea':'South Korea',inplace=True)

【讨论】:

虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。 这应该是选择的答案。有关此答案的更多信息,请访问pandas.pydata.org/docs/reference/api/…【参考方案4】:

如果您有 MultiIndex DataFrame,请执行以下操作:

# input DataFrame
import pandas as pd
t = pd.DataFrame(data='i1':[0,0,0,0,1,1,1,1,2,2,2,2],
                       'i2':[0,1,2,3,0,1,2,3,0,1,2,3],
                       'x':[1.,2.,3.,4.,5.,6.,7.,8.,9.,10.,11.,12.])
t.set_index(['i1','i2'], inplace=True)
t.sort_index(inplace=True)

# changes index level 'i1' values 0 to -1
t.rename(index=0:-1, level='i1', inplace=True)

【讨论】:

@Abdul Rafay 的回答也适用于多索引【参考方案5】:

@EdChum 的解决方案看起来不错。 这是一个使用重命名的方法,它将替换索引中的所有这些值。

energy.rename(index='Republic of Korea':'South Korea',inplace=True)

这是一个例子

>>> example = pd.DataFrame('key1' : ['a','a','a','b','a','b'],
           'data1' : [1,2,2,3,nan,4],
           'data2' : list('abcdef'))
>>> example.set_index('key1',inplace=True)
>>> example
      data1 data2
key1             
a       1.0     a
a       2.0     b
a       2.0     c
b       3.0     d
a       NaN     e
b       4.0     f

>>> example.rename(index='a':'c') # can also use inplace=True
      data1 data2
key1             
c       1.0     a
c       2.0     b
c       2.0     c
b       3.0     d
c       NaN     e
b       4.0     f

【讨论】:

这应该是最好的答案了。 这可以在多索引的一个级别上完成吗?【参考方案6】:

这是另一个不错的,在列上使用replace。

df.reset_index(inplace=True)
df.drop('index', axis = 1, inplace=True)
df["Country"].replace("Republic of Korea", value="South Korea", inplace=True)
df.set_index("Country", inplace=True)

【讨论】:

【参考方案7】:

这是基于set_value的另一个想法

df = df.reset_index()
df.drop('index', axis = 1, inplace=True)
index = df.index[df["Country"] == "Republic of Korea"]
df.set_value(index, "Country", "South Korea")
df = df.set_index("Country")
df["Country"] = df.index

【讨论】:

谢谢,set_value 正是我想要的!我试图使用 df.iloc[index]['Country'] = value 之类的东西设置值,但是得到了 SettingWithCopyWarning 并且它不起作用【参考方案8】:

你想做这样的事情:

as_list = df.index.tolist()
idx = as_list.index('Republic of Korea')
as_list[idx] = 'South Korea'
df.index = as_list

基本上,您将索引作为列表获取,更改其中一个元素,然后替换现有索引。

【讨论】:

如果您有一个索引名称,这将删除索引名称。小心点。最后一行的更好方法是df.index._data = np.array(as_list),它只会更改索引的值,而不会弄乱索引的其他属性。 更好的方法是使用as_list = df.index.values.copy(),而不是第一行中的as_list = df.index.tolist()。那么最后一行应该是df.index._data = as_list.copy()。这与@Zhang18 的评论 AFAIK 没有任何区别,如果所有索引都设置正确,但是如果某些行的任何索引列为空(导致NaN)并且如果您想保留其他怪癖数组,您不应该使用np.array(...),因为它们会将NaN 转换为'nan'。旁注,df.index.valuesdtype=object,所以分配任何字符串都不会有问题。

以上是关于如何更改熊猫数据框中的单个索引值?的主要内容,如果未能解决你的问题,请参考以下文章

如何更改多索引数据框中的索引

确定熊猫数据框中的列值何时更改

列值不在熊猫数据框中的索引中

如何使用熊猫更改数据框中的特定行值? [复制]

如何获取熊猫数据框中的行,列中具有最大值并保留原始索引?

如何更改熊猫数据框中多索引的外层索引?