给定一个索引列表,在这些索引处修改 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】:您还需要提供col1
的index
,因为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)[重复]