给定一个索引列表,在这些索引处修改 pandas 系列的一个子集

Posted

技术标签:

【中文标题】给定一个索引列表,在这些索引处修改 pandas 系列的一个子集【英文标题】:Given a list of indices, modifying a subset of a pandas series at these indices 【发布时间】:2019-05-14 13:13:07 【问题描述】:

我想将 index = [1,3,5,7,9] 处的数据框的值更改为其他值。但是下面的代码根本不能工作。

df = pd.DataFrame('col1': [1000]*12)
s1 = pd.Series([i for i in range(2,7)])#supposedly new values
index = [2*i+1 for i in range(5)]#Given indices
df.iloc[index]['col1'] = s1#attempt to modify the values
print(df)

输出如下:

   col1
0  1000
1  1000
2  1000
3  1000
4  1000
5  1000
6  1000
7  1000
8  1000
9  1000
10 1000
11 1000
C:/Users/User/Desktop/all python file/3.2.4/iloc_assign.py:13: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy

【问题讨论】:

这里需要什么输出? 【参考方案1】:

您还需要提供col1index,因为df.iloc 采用整数索引:

>>> df.iloc[index, 0] = s1.values 
>>> df
      col1
0   1000.0
1      2.0
2   1000.0
3      3.0
4   1000.0
5      4.0
6   1000.0
7      5.0
8   1000.0
9      6.0
10  1000.0
11  1000.0

您可以使用df.columns.get_loc 获取列的索引。因此,总体而言,您的代码应如下所示:

import pandas as pd
df = pd.DataFrame('col1': [1000]*12)
s1 = pd.Series([i for i in range(2,7)])
index = [2*i+1 for i in range(5)] 
df.iloc[index, df.columns.get_loc('col1')] = s1.values

【讨论】:

谢谢@MedAli @mohammed-ali-jamaoui 现在使用 pandas 1.0.5 执行此操作会发出警告 A value is trying to be set on a copy of a slice from a DataFrame【参考方案2】:

我相信你只是需要

>>> df.loc[index, 'col1'] = s1.values                                                                                  
>>> df                                                                                                                 
    col1
0   1000
1      2
2   1000
3      3
4   1000
5      4
6   1000
7      5
8   1000
9      6
10  1000
11  1000

【讨论】:

谢谢@Timgeb 现在使用 pandas 1.0.5 执行此操作会发出警告`正在尝试在 DataFrame 中的切片副本上设置值`

以上是关于给定一个索引列表,在这些索引处修改 pandas 系列的一个子集的主要内容,如果未能解决你的问题,请参考以下文章

算法:按字典顺序在给定索引处查找给定字符串的字谜

Pandas Dataframe 中的索引行不在索引列表中(Python)[重复]

pandas 结合两个 dfs:如果任一 df 在该索引处具有空值,则不保留

Python Pandas 索引错误:列表索引超出范围

11、pandas的修改列名和索引rename()

如何找到一个项目第n次出现在列表中的索引?