我有一个包含三个字符串列的数据框.我知道第3列中唯一的一个值对前两个的每个组合都有效.要清理数据,我必须按数据框前两列进行分组,并为每个组合选择第三列的最常见值.
我的代码:
import pandas as pd
from scipy import stats
source = pd.DataFrame({'Country' : ['USA', 'USA', 'Russia','USA'],
'City' : ['New-York', 'New-York', 'Sankt-Petersburg', 'New-York'],
'Short name' : ['NY','New','Spb','NY']})
print source.groupby(['Country','City']).agg(lambda x: stats.mode(x['Short name'])[0])
Run Code Online (Sandbox Code Playgroud)
最后一行代码不起作用,它说"键错误'短名称'",如果我尝试仅按城市分组,那么我得到一个AssertionError.我该怎么办呢?
我尝试用python和sklearn开始一个决策树.工作方法是这样的:
import pandas as pd
from sklearn import tree
for col in set(train.columns):
if train[col].dtype == np.dtype('object'):
s = np.unique(train[col].values)
mapping = pd.Series([x[0] for x in enumerate(s)], index = s)
train_fea = train_fea.join(train[col].map(mapping))
else:
train_fea = train_fea.join(train[col])
dt = tree.DecisionTreeClassifier(min_samples_split=3,
compute_importances=True,max_depth=5)
dt.fit(train_fea, labels)
Run Code Online (Sandbox Code Playgroud)
现在我尝试使用DictVectorizer做同样的事情,但我的代码不起作用:
from sklearn.feature_extraction import DictVectorizer
vec = DictVectorizer(sparse=False)
train_fea = vec.fit_transform([dict(enumerate(sample)) for sample in train])
dt = tree.DecisionTreeClassifier(min_samples_split=3,
compute_importances=True,max_depth=5)
dt.fit(train_fea, labels)
Run Code Online (Sandbox Code Playgroud)
我在最后一行有一个错误:"ValueError:标签数量= 332448与样本数量= 55"不匹配.正如我从文档中学到的,DictVectorize旨在将名义特征转换为数字特征.我做错了什么?
纠正了(感谢ogrisel推动我做一个完整的例子):
import pandas as pd
import numpy as np
from sklearn import tree …Run Code Online (Sandbox Code Playgroud) 我正在进行具有两个数据帧的机器学习计算 - 一个用于因子,另一个用于目标值.我必须将它们分成训练和测试部分.在我看来,我找到了方法,但我正在寻找更优雅的解决方案.这是我的代码:
import pandas as pd
import numpy as np
import random
df_source = pd.DataFrame(np.random.randn(5,2),index = range(0,10,2), columns=list('AB'))
df_target = pd.DataFrame(np.random.randn(5,2),index = range(0,10,2), columns=list('CD'))
rows = np.asarray(random.sample(range(0, len(df_source)), 2))
df_source_train = df_source.iloc[rows]
df_source_test = df_source[~df_source.index.isin(df_source_train.index)]
df_target_train = df_target.iloc[rows]
df_target_test = df_target[~df_target.index.isin(df_target_train.index)]
print('rows')
print(rows)
print('source')
print(df_source)
print('source train')
print(df_source_train)
print('source_test')
print(df_source_test)
Run Code Online (Sandbox Code Playgroud)
----编辑 - unutbu解决方案(midified)---
np.random.seed(2013)
percentile = .6
rows = np.random.binomial(1, percentile, size=len(df_source)).astype(bool)
df_source_train = df_source[rows]
df_source_test = df_source[~rows]
df_target_train = df_target[rows]
df_target_test = df_target[~rows]
Run Code Online (Sandbox Code Playgroud) 我正在研究SQL Server并尝试创建一个组合来自bigint和string列的数据的单个键.为了最小化bigint's表示为字符串的大小我正在使用Base 64编码.问题是结果包括引导'A'意味着base64零并且它增加了结果字段的大小.A使用T-SQL或删除这些领先的方法是什么XQuery?
示例代码:
DECLARE @binInput VARBINARY(MAX)
SET @binInput = CAST(123 AS VARBINARY(MAX))
SELECT CAST(N'' AS XML).value('xs:base64Binary(sql:variable("@binInput"))', 'varchar(max)')
Run Code Online (Sandbox Code Playgroud)
我有一个结果AAAAew==,我宁愿看到只是ew因为这个想法是尽可能地使最后的字符串尽可能短,而base64字符串应该比base10短.
更新1:正如Richard Boyce所建议的那样我试图将bigint转换为相等的字符串,但由于base64转换它给出了null
declare @input bigint
declare @varInput nvarchar(max)
set @input = 123
set @varInput = cast(cast(@input as varbinary(max)) as varchar(max))
select CAST(N'' AS xml).value('xs:base64Binary(sql:variable("@varInput"))', 'varchar(max)')
Run Code Online (Sandbox Code Playgroud)
更新2:当前的解决方案是获取base64binary字符串并删除前导'A和尾随'='.它并不完美,所以欢迎任何建议.实际代码:
declare @input bigint
set @input = 1234567890
declare @output varchar(max)
set @output = (select cast(@input …Run Code Online (Sandbox Code Playgroud) python ×3
pandas ×2
base64 ×1
group-by ×1
mode ×1
scikit-learn ×1
sql-server ×1
t-sql ×1
xquery ×1