Python 3.x series.replace()有什么问题?
我试图用其他整数值替换pd.Series中的整数值,如下所示。我正在使用类似dict的替换:Python 3.x series.replace()有什么问题?,python-3.x,pandas,Python 3.x,Pandas,我试图用其他整数值替换pd.Series中的整数值,如下所示。我正在使用类似dict的替换: ser_list = [pd.Series([65, 1, 0, 0, 1]), pd.Series([0, 62, 1, 1, 0])] for ser in ser_list: ser.replace({65: 10, 62: 20}) 我期待着结果: [10, 1, 0, 0, 1] # first series in the list [0, 20, 1, 1, 0] # second
ser_list = [pd.Series([65, 1, 0, 0, 1]), pd.Series([0, 62, 1, 1, 0])]
for ser in ser_list:
ser.replace({65: 10, 62: 20})
我期待着结果:
[10, 1, 0, 0, 1] # first series in the list
[0, 20, 1, 1, 0] # second series in the list
其中,在第一个系列中,65应替换为10,在第二个系列中,62应替换为20
然而,在这段代码中,它返回的是原始系列,没有任何替换。有什么线索吗?有可能,通过
inplace=True
:
for ser in ser_list:
ser.replace({65: 10, 62: 20}, inplace=True)
print (ser_list)
[0 10
1 1
2 0
3 0
4 1
dtype: int64, 0 0
1 20
2 1
3 1
4 0
dtype: int64]
但不推荐,如评论中提到的@Dan-:
熊猫核心团队不鼓励使用inplace参数,最终它将被弃用(这意味着“计划从库中删除”)。原因如下:
inplace在方法链中不起作用。使用inplace通常不会阻止创建副本,这与名称的含义相反。
删除inplace选项将降低pandas代码库的复杂性 或在列表理解中指定给同一变量:
ser_list = [ser.replace({65: 10, 62: 20}) for ser in ser_list]
循环解决方案可以附加到新列表并重新分配:
out = []
for ser in ser_list:
ser = ser.replace({65: 10, 62: 20})
out.append(ser)
print (out)
[0 10
1 1
2 0
3 0
4 1
dtype: int64, 0 0
1 20
2 1
3 1
4 0
dtype: int64]
可以通过
inplace=True
:
for ser in ser_list:
ser.replace({65: 10, 62: 20}, inplace=True)
print (ser_list)
[0 10
1 1
2 0
3 0
4 1
dtype: int64, 0 0
1 20
2 1
3 1
4 0
dtype: int64]
但不推荐,如评论中提到的@Dan-:
熊猫核心团队不鼓励使用inplace参数,最终它将被弃用(这意味着“计划从库中删除”)。原因如下:
inplace在方法链中不起作用。使用inplace通常不会阻止创建副本,这与名称的含义相反。
删除inplace选项将降低pandas代码库的复杂性 或在列表理解中指定给同一变量:
ser_list = [ser.replace({65: 10, 62: 20}) for ser in ser_list]
循环解决方案可以附加到新列表并重新分配:
out = []
for ser in ser_list:
ser = ser.replace({65: 10, 62: 20})
out.append(ser)
print (out)
[0 10
1 1
2 0
3 0
4 1
dtype: int64, 0 0
1 20
2 1
3 1
4 0
dtype: int64]
我们还可以将
Series.map
与fillna
和列表理解一起使用:
new = [ser.map({65: 10, 62: 20}).fillna(ser) for ser in ser_list]
print(new)
[0 10.0
1 1.0
2 0.0
3 0.0
4 1.0
dtype: float64, 0 0.0
1 20.0
2 1.0
3 1.0
4 0.0
dtype: float64]
我们还可以将Series.map
与fillna
和列表理解一起使用:
new = [ser.map({65: 10, 62: 20}).fillna(ser) for ser in ser_list]
print(new)
[0 10.0
1 1.0
2 0.0
3 0.0
4 1.0
dtype: float64, 0 0.0
1 20.0
2 1.0
3 1.0
4 0.0
dtype: float64]