我有一个包含两列的简单表:UserID和Category,每个UserID可以重复几个类别,如下所示:
UserID Category
------ --------
1 A
1 B
2 C
3 A
3 C
3 B
Run Code Online (Sandbox Code Playgroud)
我想“虚拟化”该表:即创建一个输出表,该表的每个列都有由虚拟变量组成的唯一类别(0/1,取决于UserID是否属于该特定类别):
UserID A B C
------ -- -- --
1 1 1 0
2 0 0 1
3 1 1 1
Run Code Online (Sandbox Code Playgroud)
我的问题是我有数千个类别(在此示例中不只是3个类别),因此无法使用CASE WHEN语句有效地完成此操作。
所以我的问题是:
1)有没有一种方法可以在不使用数千个CASE WHEN语句的情况下“虚拟化” Google BigQuery中的Category列。
2)这是UDF功能正常工作的情况吗?看起来确实是这样,但是我对BigQuery中的UDF不够了解,无法解决此问题。有人可以帮忙吗?
谢谢。
给定一个熊猫DataFrame,如何将几个二进制列(其中1表示该值存在,0表示不存在)转换为单个分类列?
另一种思考方式是如何执行“反向 pd.get_dummies() ”?
这是将分类列转换为几个二进制列的示例:
import pandas as pd
s = pd.Series(list('ABCDAB'))
df = pd.get_dummies(s)
df
A B C D
0 1 0 0 0
1 0 1 0 0
2 0 0 1 0
3 0 0 0 1
4 1 0 0 0
5 0 1 0 0
Run Code Online (Sandbox Code Playgroud)
我想完成的是给出一个数据框
df1
A B C D
0 1 0 0 0
1 0 1 0 0
2 0 0 1 0
3 0 0 0 1
4 1 0 0 …Run Code Online (Sandbox Code Playgroud) 我正在使用此代码创建一个新的Group列,该列基于在两个组的列var中找到的部分字符串,Sui以及Swe.我不得不添加另一个组,TRD并且我一直在尝试调整ifelse功能这样做,但没有成功.这可行吗?有没有其他解决方案或其他功能可以帮助我这样做?
m.df <- molten.df%>% mutate(
Group = ifelse(str_detect(variable, "Sui"), "Sui", "Swedish"))
Current m.df:
var value
ADHD_iFullSuiTrim.Threshold1 0.00549427
ADHD_iFullSuiTrim.Threshold1 0.00513955
ADHD_iFullSweTrim.Threshold1 0.00466352
ADHD_iFullSweTrim.Threshold1 0.00491633
ADHD_iFullTRDTrim.Threshold1 0.00658535
ADHD_iFullTRDTrim.Threshold1 0.00609122
Desired Result:
var value Group
ADHD_iFullSuiTrim.Threshold1 0.00549427 Sui
ADHD_iFullSuiTrim.Threshold1 0.00513955 Sui
ADHD_iFullSweTrim.Threshold1 0.00466352 Swedish
ADHD_iFullSweTrim.Threshold1 0.00491633 Swedish
ADHD_iFullTRDTrim.Threshold1 0.00658535 TRD
ADHD_iFullTRDTrim.Threshold1 0.00609122 TRD
Run Code Online (Sandbox Code Playgroud)
即使可以使用其他功能完成结果,也可以理解任何帮助或建议.
我想知道如何简单地创建虚拟变量.我在假人身上发现了许多类似的问题,但要么是基于一些外部包装或技术.
我有这样的数据:
df <- data.frame(X=rnorm(10,0,1), Y=rnorm(10,0,1))
df$Z <- c(NA, diff(df$X)*diff(df$Y))
Run Code Online (Sandbox Code Playgroud)
ž创建在X和变化在Y.变化的DF即产物中一个新的变量现在我想在DF创建一个虚拟变量d使得如果位:Z <0则d == 1,如果Z> 0,则d == 0.
我试过这样的方式:
df$D <- NA
for(i in 2:10) {
if(df$Z[i] <0 ) {
D[i] ==1
}
if(df$Z[i] >0 ) {
D[i] ==0
}}
Run Code Online (Sandbox Code Playgroud)
这不起作用.我想知道为什么上面的代码不起作用(这很容易做到这一点)以及虚拟变量如何在R中创建而不使用任何外部包而只需要一点点解释.
我正在从Stata转换到R.在Stata中,如果我将因子级别(比如-0和1)标记为(M和F),则0和1将保持不变.此外,在大多数软件(包括Excel和SPSS)中,这是虚拟变量线性回归所必需的.
但是,我注意到R默认因子水平为1,2而不是0,1.我不知道为什么R会这样做,尽管内部(并且正确地)回归假定0和1作为因子变量.我将不胜感激任何帮助.
这是我做的:
尝试#1:
sex<-c(0,1,0,1,1)
sex<-factor(sex,levels = c(1,0),labels = c("F","M"))
str(sex)
Factor w/ 2 levels "F","M": 2 1 2 1 1
Run Code Online (Sandbox Code Playgroud)
似乎因子水平现在重置为1和2.我相信1和2是这里对因子水平的引用.但是,我丢失了原始值,即0和1.
Try2:
sex<-c(0,1,0,1,1)
sex<-factor(sex,levels = c(0,1),labels = c("F","M"))
str(sex)
Factor w/ 2 levels "F","M": 1 2 1 2 2
Run Code Online (Sandbox Code Playgroud)
同上.我的0和1现在是1和2.非常令人惊讶.为什么会这样呢?
Try3 现在,我想知道1和2是否有任何不良影响回归.所以,这就是我做的:
这是我的数据:
> head(data.frame(sassign$total_,sassign$gender))
sassign.total_ sassign.gender
1 357 M
2 138 M
3 172 F
4 272 F
5 149 F
6 113 F
myfit<-lm(sassign$total_ ~ sassign$gender)
myfit$coefficients
(Intercept) sassign$genderM
200.63522 23.00606
Run Code Online (Sandbox Code Playgroud)
事实证明,手段是正确的.在运行回归时,R确实使用0和1值作为假人.
我确实在SO上检查了其他线程,但是他们主要讨论R代码如何在不告诉我原因的情况下对变量进 Stata和SPSS通常要求基变量为"0".所以,我想到了这个问题.
我很感激任何想法.
如何将 pandas 数据帧转换为 sklearn one-hot-encoded(数据帧/numpy 数组),其中某些列不需要编码?
mydf = pd.DataFrame({'Target':[0,1,0,0,1, 1,1],
'GroupFoo':[1,1,2,2,3,1,2],
'GroupBar':[2,1,1,0,3,1,2],
'GroupBar2':[2,1,1,0,3,1,2],
'SomeOtherShouldBeUnaffected':[2,1,1,0,3,1,2]})
columnsToEncode = ['GroupFoo', 'GroupBar']
Run Code Online (Sandbox Code Playgroud)
是一个已经标签编码的数据帧,我只想对 标记的列进行编码columnsToEncode?
我的问题是我不确定 apd.Dataframe或numpy数组表示是否更好以及如何将编码部分与另一个部分重新合并。
到目前为止我的尝试:
myEncoder = OneHotEncoder(sparse=False, handle_unknown='ignore')
myEncoder.fit(X_train)
df = pd.concat([
df[~columnsToEncode], # select all other / numeric
# select category to one-hot encode
pd.Dataframe(encoder.transform(X_train[columnsToEncode]))#.toarray() # not sure what this is for
], axis=1).reindex_axis(X_train.columns, axis=1)
Run Code Online (Sandbox Code Playgroud)
注意:我知道Pandas: Get Dummies / http://pandas.pydata.org/pandas-docs/stable/ generated/pandas.get_dummies.html 但在我需要这样的火车/测试拆分中效果不佳每折叠一个编码。
我正在尝试使用get_dummiesviadask但它不会转换我的变量,也不会出错:
>>> import dask.dataframe as dd
>>> import pandas as pd
>>> df_d = dd.read_csv('/datasets/dask_example/dask_get_dummies_example.csv')
>>> df_d.head()
uid gender
0 1 M
1 2 NaN
2 3 NaN
3 4 F
4 5 NaN
>>> daskDataCategorical = df_d[['gender']]
>>> daskDataDummies = dd.get_dummies(daskDataCategorical)
>>> daskDataDummies.head()
gender
0 M
1 NaN
2 NaN
3 F
4 NaN
>>> daskDataDummies.compute()
gender
0 M
1 NaN
2 NaN
3 F
4 NaN
5 F
6 M
7 F
8 M …Run Code Online (Sandbox Code Playgroud) 考虑一个具有列"id"的Pandas数据帧,该列的行包含表示类别的字符串列表.获取虚拟变量的有效方法是什么?
例:
输入:
df1 = pd.DataFrame({'id': ['0,1', '24,25', '1,24']})
Run Code Online (Sandbox Code Playgroud)
输出:
df2 = pd.DataFrame({'0':[1, 0, 0],
'1': [1, 0, 1],
'24':[0, 1, 1],
'25':[0, 1, 0]})
Run Code Online (Sandbox Code Playgroud) 一些建模功能,例如glmnet(),要求(或仅允许)将数据作为预测器矩阵和响应矩阵(或向量)传递,如使用公式所示。在这些情况下,通常情况是该predict()方法(例如predict.glmnet())要求newdata参数提供一个预测器矩阵,该矩阵具有与训练模型相同的特征。
当数据框具有因子(R的分类数据类型)时,创建预测变量矩阵的便捷方法是使用该model.matrix()函数,该函数会自动为分类变量创建虚拟特征:
# this is the dataframe and matrix I want to use to train the model
set.seed(1)
df <- data.frame(x1 = factor(sample(LETTERS[1:5], replace = T, 20)),
x2 = rnorm(20, 100, 5),
x3 = factor(sample(c("U","L"), replace = T, 20)),
y = rnorm(20, 10, 2))
mm <- model.matrix(y~., data = df)
Run Code Online (Sandbox Code Playgroud)
但是,当我引入一个带有新观察结果的数据框时,它仅包含原始数据框中因子水平的一个子集,model.matrix()(可预测地)返回一个具有不同虚拟特征的矩阵。无法使用此新矩阵,predict.glm()因为它没有模型期望的相同功能:
# this is the dataframe and matrix I want to predict on
set.seed(1) …Run Code Online (Sandbox Code Playgroud) 我有一组数据。我使用熊猫分别将它们转换为虚拟变量和分类变量。那么,现在我想知道如何在Python中运行多元线性回归(我正在使用statsmodels)?是否有一些考虑因素,或者也许我必须指出我的代码中变量是虚拟的还是分类的?也许变量的转换就足够了,我只需要将回归作为model = sm.OLS(y, X).fit()?运行。
我的代码如下:
datos = pd.read_csv("datos_2.csv")
df = pd.DataFrame(datos)
print(df)
Run Code Online (Sandbox Code Playgroud)
我得到这个:
Age Gender Wage Job Classification
32 Male 450000 Professor High
28 Male 500000 Administrative High
40 Female 20000 Professor Low
47 Male 70000 Assistant Medium
50 Female 345000 Professor Medium
27 Female 156000 Assistant Low
56 Male 432000 Administrative Low
43 Female 100000 Administrative Low
Run Code Online (Sandbox Code Playgroud)
然后我这样做:1 =男性,0 =女性,1:教授,2:行政,3:助理:
df['Sex_male']=df.Gender.map({'Female':0,'Male':1})
df['Job_index']=df.Job.map({'Professor':1,'Administrative':2,'Assistant':3})
print(df)
Run Code Online (Sandbox Code Playgroud)
得到这个:
Age Gender Wage Job Classification Sex_male Job_index
32 Male 450000 Professor High 1 …Run Code Online (Sandbox Code Playgroud) dummy-variable ×10
pandas ×5
python ×5
r ×4
dataframe ×3
binary ×1
dask ×1
dplyr ×1
grouping ×1
matrix ×1
mysql ×1
numpy ×1
prediction ×1
regression ×1
scikit-learn ×1
sql ×1
statsmodels ×1