根据熊猫中的另一个值更改一个值

新手上路,请多包涵

我试图在 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:
          ...

不知道从这里去哪里。有任何想法吗?

原文由 Parseltongue 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 518
2 个回答

一种选择是使用 Python 的切片和索引功能以逻辑方式评估条件所在的位置并覆盖那里的数据。

假设您可以使用 pandas.read_csv 将数据直接加载到 pandas 中,那么以下代码可能对您有所帮助。

 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'

请注意,您需要 pandas 版本 0.11 或更高版本才能使用 loc 进行覆盖分配操作。


另一种方法是使用所谓的链式赋值。这种行为不太稳定,因此它不被认为是最佳解决方案(在文档中 明确不鼓励),但了解以下内容很有用:

 import pandas
df = pandas.read_csv("test.csv")
df['FirstName'][df.ID == 103] = "Matt"
df['LastName'][df.ID == 103] = "Jones"

原文由 ely 发布,翻译遵循 CC BY-SA 4.0 许可协议

您可以使用 map ,它可以映射来自字典甚至自定义函数的值。

假设这是你的 df:

     ID First_Name Last_Name
0  103          a         b
1  104          c         d

创建字典:

 fnames = {103: "Matt", 104: "Mr"}
lnames = {103: "Jones", 104: "X"}

和地图:

 df['First_Name'] = df['ID'].map(fnames)
df['Last_Name'] = df['ID'].map(lnames)

结果将是:

     ID First_Name Last_Name
0  103       Matt     Jones
1  104         Mr         X

或者使用自定义函数:

 names = {103: ("Matt", "Jones"), 104: ("Mr", "X")}
df['First_Name'] = df['ID'].map(lambda x: names[x][0])

原文由 Rutger Kassies 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题