Python pandas相当于替换

时间:2012-08-28 04:18:11

标签: python pandas equivalent

在R中,有一个相当有用的replace函数。 实质上,它在数据帧的给定列中进行条件重新赋值。 它可以这样使用: replace(df$column, df$column==1,'Type 1');

在熊猫中实现相同目标的好方法是什么?

我应该使用apply的lambda吗? (如果是这样,我如何获得对给定列的引用,而不是整行)。

我应该在np.where上使用data_frame.values吗? 看来我在这里错过了一件非常明显的事情。

任何建议都表示赞赏。

2 个答案:

答案 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::mapvaluesplyr::revaluestringr::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

在想要用相同的值替换多个不同值的特殊情况下,可以只用一个字符串作为替换。它不能在列表中。将al替换为p s

In [29]: s.replace(["a", "l"], "p", regex=True)
Out[29]: 
0        ppe
1     monkey
2    sepgupp
dtype: object

(在评论中归功于DaveL17)