我试图用Python重现我的Stata代码,我被指向了Pandas的方向。然而,我很难理解如何处理数据。
假设我想覆盖列头'ID'中的所有值。如果该ID匹配一个特定的数字,那么我想更改两个相应的值FirstName和LastName。
在Stata中,它看起来像这样:
replace FirstName = "Matt" if ID==103
replace LastName = "Jones" if ID==103
字符串
因此,这将替换FirstName中与ID == 103到Matt值对应的所有值。
在Pandas中,我正在尝试这样的东西
df = read_csv("test.csv")
for i in df['ID']:
if i ==103:
...
型
不知道该怎么办。有什么想法吗?
7条答案
按热度按时间azpvetkf1#
一种选择是使用Python的切片和索引功能来逻辑地评估条件保持的位置并覆盖那里的数据。
假设您可以使用
pandas.read_csv
将数据直接加载到pandas
中,那么下面的代码可能对您有帮助。字符串
正如在注解中提到的,你也可以一次完成对两列的赋值:
型
**请注意,您需要
pandas
版本0.11或更高版本才能使用loc
进行覆盖赋值操作。**实际上,对于像0.8这样的旧版本(尽管链式赋值的批评者可能会说),链式赋值是 * 正确的 * 方式,因此即使在更现代的pandas版本中应该避免,了解它也是有用的。另一种方法是使用所谓的链式赋值。这种方法的行为不太稳定,因此它不被认为是最好的解决方案(在文档中明确不鼓励),但了解以下内容是有用的:
型
lp0sw83n2#
你可以使用
map
,它可以从一个字典甚至一个自定义函数Mapvales。假设这是你的DF:
字符串
创建dicts:
型
和Map:
型
结果将是:
型
或者使用自定义函数:
型
nhaq1z213#
最初的问题解决了一个特定的狭义用例。对于那些需要更通用答案的人,这里有一些例子:
使用其他列的数据创建新列
考虑到下面的框架:
字符串
下面我们通过使用
+
操作添加一个新的description
列作为其他列的串联。对于series,+
操作被覆盖。花哨的字符串格式,f字符串等在这里不起作用,因为+
适用于标量而不是“原始”值:型
我们得到了猫的
1 years
(而不是1 year
),我们将在下面使用条件修正。使用条件修改现有列
在这里,我们将原始的
animal
列替换为其他列的值,并使用np.where
根据age
的值设置一个条件子串:型
使用条件修改多列
一种更灵活的方法是在整个框架上调用
.apply()
,而不是在单个列上:型
在上面的代码中,
transform_row(r)
函数接受一个表示给定行的Series
对象(由axis=1
表示,axis=0
的默认值将为每列提供一个Series
对象)。这简化了处理,因为您可以使用列名访问行中的实际“原始”值,并可以看到给定行/列中的其他单元格。rqdpfwrv4#
这个问题可能仍然经常被访问,因此值得为Kemp先生的答案提供一个补充。
dict
内置类可以被子类化,以便为“丢失”键返回默认值。这种机制在pandas中工作得很好。但请参阅下文。这样就可以避免关键错误。
字符串
同样的事情可以用下面的方法更简单地完成。对dict对象的
get
方法使用“default”参数使得没有必要子类化dict。型
2eafrhcq5#
字符串
yb3bgrhw6#
如果有人正在寻找一种方法来根据每行本身的某些逻辑条件更改多行的值,那么将
.apply()
与函数一起使用就是一种方法。字符串
虽然
.apply()
通常用于向一个嵌套框架添加一个新的行/列,但它也可以用于修改现有行/列的值。xam8gpfp7#
我发现通过打印出每一行满足条件的地方来首次亮相要容易得多:
字符串