在R中,有一个相当有用的replace功能.实质上,它在数据帧的给定列中进行条件重新赋值.它可以这样使用:
replace(df$column, df$column==1,'Type 1');
在熊猫中实现相同目标的好方法是什么?
我应该使用lambda apply吗?(如果是这样,我如何获得对给定列的引用,而不是整行).
我应该使用np.where的data_frame.values?看来我在这里错过了一件非常明显的事情.
任何建议表示赞赏.
我正在使用Jeremy Evan的续集来填充(SQLite)数据库,其中包含我从网页中搜集的数据.该数据库涉及我与协会表达的许多多对多关系.关联是在类定义中创建的,在运行脚本时始终会对其进行评估.重要的是,关联类定义需要具有必要的表.因此,表创建方法应该在关联定义的顶层.这是一个例子:
module Thing
db = Sequel.Sqlite('data.sqlite')
db.create_table(:clients)
String :client_id, :primary_key => true
String :client_data
end
db.create_table(:orders)
String :order_id, :primary_key => true
String :order_data
end
db.create_table(:orders_clients)
String :order_id
String :client_id
primary_key [:order_id,:client_id]
end
class Person < Sequel::Model
unrestrict_primary_key
many_to_many :orders
end
class Order < Sequel::Model
unrestrict_primary_key
many_to_many :orders
end
end
Run Code Online (Sandbox Code Playgroud)
首先,我认为这是一个相当脏的解决方案,因为我的方法调用和类定义位于同一名称空间中.如果我尝试分离类定义,我会得到No database associated with Sequel::Model错误(这是有道理的,但我想推迟对关联定义的评估,在表调用之后,只要它们可能发生).
我希望能够在方法调用中创建表和关联.因此,我可以传递新数据库文件的名称:
def create_tables_and_schema (database_name)
db = Sequel.Sqlite(database_name)
db.create_table... #three of those, as above
class Person < Sequel::Model
unrestrict_primary_key
many_to_many …Run Code Online (Sandbox Code Playgroud) 我正奇怪的错误与逐行mutate在dplyr.这是一个例子:
set.seed(1)
df <- data.frame(a = rnorm(5), b = rnorm(5))
df[2,'b'] <- NA
Run Code Online (Sandbox Code Playgroud)
没有问题sum,但汇总功能有问题:
mutate(rowwise(df), sum(a, b, na.rm = T)) # works
mutate(rowwise(df), mean(a, b, na.rm = T))
#! Error: missing value where TRUE/FALSE needed
mutate(rowwise(df), median(a, b, na.rm = T))
#! Error: unused argument (-0.820468384118015)
Run Code Online (Sandbox Code Playgroud)
现在,我们可以尝试NA在第一列:
df <- data.frame(a = rnorm(5), b = rnorm(5))
df[2,'a'] <- NA
mutate(rowwise(df), sum(a, b, na.rm = T)) # works
mutate(rowwise(df), mean(a, b, na.rm = T)) …Run Code Online (Sandbox Code Playgroud)