在R中,有一个相当有用的replace
函数。
实质上,它在数据帧的给定列中进行条件重新赋值。
它可以这样使用:
replace(df$column, df$column==1,'Type 1');
在熊猫中实现相同目标的好方法是什么?
我应该使用apply
的lambda吗? (如果是这样,我如何获得对给定列的引用,而不是整行)。
我应该在np.where
上使用data_frame.values
吗?
看来我在这里错过了一件非常明显的事情。
任何建议都表示赞赏。
答案 0 :(得分:28)
pandas
也有replace
方法:
In [25]: df = DataFrame({1: [2,3,4], 2: [3,4,5]})
In [26]: df
Out[26]:
1 2
0 2 3
1 3 4
2 4 5
In [27]: df[2]
Out[27]:
0 3
1 4
2 5
Name: 2
In [28]: df[2].replace(4, 17)
Out[28]:
0 3
1 17
2 5
Name: 2
In [29]: df[2].replace(4, 17, inplace=True)
Out[29]:
0 3
1 17
2 5
Name: 2
In [30]: df
Out[30]:
1 2
0 2 3
1 3 17
2 4 5
或者您可以使用numpy
样式的高级索引:
In [47]: df[1]
Out[47]:
0 2
1 3
2 4
Name: 1
In [48]: df[1] == 4
Out[48]:
0 False
1 False
2 True
Name: 1
In [49]: df[1][df[1] == 4]
Out[49]:
2 4
Name: 1
In [50]: df[1][df[1] == 4] = 19
In [51]: df
Out[51]:
1 2
0 2 3
1 3 17
2 19 5
答案 1 :(得分:5)
Pandas doc for replace
没有任何例子,所以我会在这里给出一些。对于那些来自R视角的人(像我一样),replace
基本上是一个通用的替换函数,它结合了R函数plyr::mapvalues
,plyr::revalue
和stringr::str_replace_all
的功能。由于DSM涵盖了单值的情况,我将介绍多值情况。
示例系列
In [10]: x = pd.Series([1, 2, 3, 4])
In [11]: x
Out[11]:
0 1
1 2
2 3
3 4
dtype: int64
我们想用负整数替换正整数(而不是乘以-1)。
两个值列表
通过使用我们想要替换的值的一个列表(或pandas系列)和使用我们想要替换它们的值的第二个列表来实现此目的的一种方法。
In [14]: x.replace([1, 2, 3, 4], [-1, -2, -3, -4])
Out[14]:
0 -1
1 -2
2 -3
3 -4
dtype: int64
这相当于plyr::mapvalues
。
价值对词典
有时候,拥有一对价值对词典会更方便。索引是我们替换的索引,值是我们替换它的值。
In [15]: x.replace({1: -1, 2: -2, 3: -3, 4: -4})
Out[15]:
0 -1
1 -2
2 -3
3 -4
dtype: int64
这相当于plyr::revalue
。
<强>字符串强>
除了我们还可以选择使用正则表达式模式之外,它对字符串的工作方式类似。
如果我们只想用其他字符串替换字符串,它的工作方式与以前完全相同:
In [18]: s = pd.Series(["ape", "monkey", "seagull"])
In [22]: s
Out[22]:
0 ape
1 monkey
2 seagull
dtype: object
两个列表
In [25]: s.replace(["ape", "monkey"], ["lion", "panda"])
Out[25]:
0 lion
1 panda
2 seagull
dtype: object
<强>词典强>
In [26]: s.replace({"ape": "lion", "monkey": "panda"})
Out[26]:
0 lion
1 panda
2 seagull
dtype: object
<强>正则表达式强>
将所有a
替换为x
s。
In [27]: s.replace("a", "x", regex=True)
Out[27]:
0 xpe
1 monkey
2 sexgull
dtype: object
将所有l
替换为x
s。
In [28]: s.replace("l", "x", regex=True)
Out[28]:
0 ape
1 monkey
2 seaguxx
dtype: object
请注意,l
中的seagull
都已被替换。
将a
替换为x
s,将l
替换为p
s
In [29]: s.replace(["a", "l"], ["x", "p"], regex=True)
Out[29]:
0 xpe
1 monkey
2 sexgupp
dtype: object
在想要用相同的值替换多个不同值的特殊情况下,可以只用一个字符串作为替换。它不能在列表中。将a
和l
替换为p
s
In [29]: s.replace(["a", "l"], "p", regex=True)
Out[29]:
0 ppe
1 monkey
2 sepgupp
dtype: object
(在评论中归功于DaveL17)