我试图在 Python 中重现我的 Stata 代码,我被指向了 Pandas 的方向。然而,我很难思考如何处理数据。
假设我想遍历列标题“ID”中的所有值。如果该 ID 与特定数字匹配,那么我想更改两个对应的值 FirstName 和 LastName。
在 Stata 中,它看起来像这样:
replace FirstName = "Matt" if ID==103 replace LastName = "Jones" if ID==103
因此,这会将 FirstName 中与 ID == 103 的值对应的所有值替换为 Matt。
在熊猫中,我正在尝试这样的事情
df = read_csv("test.csv") for i in df['ID']: if i ==103: ...
不知道从这里去哪里。有任何想法吗?
一种选择是使用 Python 的切片和索引功能以逻辑方式评估条件所在的位置并覆盖那里的数据。
假设您可以直接将数据加载到pandas其中,pandas.read_csv那么以下代码可能对您有所帮助。
pandas
pandas.read_csv
import pandas df = pandas.read_csv("test.csv") df.loc[df.ID == 103, 'FirstName'] = "Matt" df.loc[df.ID == 103, 'LastName'] = "Jones"
如评论中所述,您还可以一次性对两列进行分配:
df.loc[df.ID == 103, ['FirstName', 'LastName']] = 'Matt', 'Jones'
请注意,您需要pandas0.11 或更高版本才能使用loc覆盖分配操作。
loc
另一种方法是使用所谓的链式赋值。这种行为不太稳定,因此它不被认为是最佳解决方案(在文档中明确不鼓励),但了解以下内容很有用:
import pandas df = pandas.read_csv("test.csv") df['FirstName'][df.ID == 103] = "Matt" df['LastName'][df.ID == 103] = "Jones"