标签: data-cleaning

熊猫中的多列分解

pandas factorize函数将一系列中的每个唯一值分配给基于0的顺序索引,并计算每个系列条目所属的索引.

我想pandas.factorize在多列上完成相同的操作:

import pandas as pd
df = pd.DataFrame({'x': [1, 1, 2, 2, 1, 1], 'y':[1, 2, 2, 2, 2, 1]})
pd.factorize(df)[0] # would like [0, 1, 2, 2, 1, 0]
Run Code Online (Sandbox Code Playgroud)

也就是说,我想确定数据帧的几列中每个唯一值的元组,为每个列分配一个顺序索引,并计算数据帧中每一行所属的索引.

Factorize仅适用于单列.pandas中有多列等效函数吗?

python enumeration pandas data-cleaning

12
推荐指数
1
解决办法
5620
查看次数

如何清理R中的twitter数据?

我使用twitteR包从twitter中提取推文并将其保存到文本文件中.

我在语料库上进行了以下操作

xx<-tm_map(xx,removeNumbers, lazy=TRUE, 'mc.cores=1')
xx<-tm_map(xx,stripWhitespace, lazy=TRUE, 'mc.cores=1')
xx<-tm_map(xx,removePunctuation, lazy=TRUE, 'mc.cores=1')
xx<-tm_map(xx,strip_retweets, lazy=TRUE, 'mc.cores=1')
xx<-tm_map(xx,removeWords,stopwords(english), lazy=TRUE, 'mc.cores=1')
Run Code Online (Sandbox Code Playgroud)

(使用mc.cores = 1和lazy = True,否则Mac上的R运行错误)

tdm<-TermDocumentMatrix(xx)
Run Code Online (Sandbox Code Playgroud)

但是这个术语文档矩阵有很多奇怪的符号,无意义的单词等.如果推文是

 RT @Foxtel: One man stands between us and annihilation: @IanZiering.
 Sharknado‚Äã 3: OH HELL NO! - July 23 on Foxtel @SyfyAU
Run Code Online (Sandbox Code Playgroud)

清理完推文后,我只想留下适当的完整英文单词,即句子/短语无效(用户名,缩短的单词,网址)

例:

One man stands between us and annihilation oh hell no on 
Run Code Online (Sandbox Code Playgroud)

(注意:tm包中的转换命令只能删除停用词,标点符号空格以及转换为小写)

twitter r text-mining data-cleaning

11
推荐指数
2
解决办法
2万
查看次数

从MySQL日期字段中阻止'0000-00-00'

我有一个数据库,旧代码喜欢在Date和DateTime列中插入'0000-00-00'而不是实际日期.所以我有以下两个问题:

  1. 有什么我可以在db级别上阻止这个吗?我知道我可以将列设置为非null,但这似乎不会阻止这些零值.
  2. 检测日期字段中现有零值的最佳方法是什么?我有大约一百个表,每个表有2-3个日期列,我不想单独查询它们.

跟进:

默认值已设置为null.很久以前,默认是'0000-00-00'.一些代码仍然明确地放置'0000-00-00'.我宁愿强制该代码抛出错误,以便我可以隔离并删除它.

mysql datetime date data-cleaning

10
推荐指数
2
解决办法
9962
查看次数

pandas.to_numeric - 找出它无法解析的字符串

应用于pandas.to_numeric包含表示数字(以及可能的其他不可解析字符串)的字符串的数据帧列会导致出现如下错误消息:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-66-07383316d7b6> in <module>()
      1 for column in shouldBeNumericColumns:
----> 2     trainData[column] = pandas.to_numeric(trainData[column])

/usr/local/lib/python3.5/site-packages/pandas/tools/util.py in to_numeric(arg, errors)
    113         try:
    114             values = lib.maybe_convert_numeric(values, set(),
--> 115                                                coerce_numeric=coerce_numeric)
    116         except:
    117             if errors == 'raise':

pandas/src/inference.pyx in pandas.lib.maybe_convert_numeric (pandas/lib.c:53558)()

pandas/src/inference.pyx in pandas.lib.maybe_convert_numeric (pandas/lib.c:53344)()

ValueError: Unable to parse string
Run Code Online (Sandbox Code Playgroud)

看看哪个值无法解析会不会有帮助?

python pandas data-cleaning data-science

10
推荐指数
1
解决办法
2万
查看次数

dplyr管道 - 如何更改原始数据帧

当我不使用管道时,我可以使用此命令更改原始daframe

df<-slice(df,-c(1:3))%>% # delete top 3 rows
df<-select(df,-c(Col1,Col50,Col51)) # delete specific columns
Run Code Online (Sandbox Code Playgroud)

如何使用管道做到这一点?我试过这个但是sliceselect函数不会改变原始数据帧.

df%>%
  slice(-c(1:3))%>% 
  select(-c(Col1,Col50,Col51))
Run Code Online (Sandbox Code Playgroud)

我想改变原来的df.

r dplyr data-cleaning

9
推荐指数
1
解决办法
3937
查看次数

使用R将单个柱分成多个观察

我正在研究HCUP数据,它在一个列中有一系列值,需要拆分成多列.以下是HCUP数据框供参考:

code            label
61000-61003     excision of CNS
0169T-0169T     ventricular shunt
Run Code Online (Sandbox Code Playgroud)

期望的输出应该是:

code            label
61000           excision of CNS
61001           excision of CNS
61002           excision of CNS
61003           excision of CNS
0169T           ventricular shunt
Run Code Online (Sandbox Code Playgroud)

我解决这个问题的方法是使用包splitstackshape并使用此代码

library(data.table)
library(splitstackshape)

cSplit(hcup, "code", "-")[, list(code = code_1:code_2, by = label)]
Run Code Online (Sandbox Code Playgroud)

这种方法会导致内存问题.有没有更好的方法来解决这个问题?

一些评论:

  • 除"T"之外,数据有许多字母.
  • 这封信可以在前面或最后但不在两个数字之间.
  • 在一个范围内,"T"到"U"的字母没有变化

r medical data.table data-cleaning splitstackshape

8
推荐指数
2
解决办法
1055
查看次数

清理R数据框,以便在列中没有行值大于下一行值的2倍

我有一个数据框,如下所示

dist <- c(1.1,1.0,10.0,5.0,2.1,12.2,3.3,3.4)
id <- rep("A",length(dist))
df<-cbind.data.frame(id,dist)

df

  id dist
1  A  1.1
2  A  1.0
3  A 10.0
4  A  5.0
5  A  2.1
6  A 12.2
7  A  3.3
8  A  3.4
Run Code Online (Sandbox Code Playgroud)

我需要清理它,因此dist列中的行值在任何时候都不会大于下一行值的2倍.清理后的数据框如下所示:

  id dist
1  A  1.1
2  A  1.0
5  A  2.1
7  A  3.3
8  A  3.4
Run Code Online (Sandbox Code Playgroud)

我已经尝试使用for循环和if语句来清理它

cleaner <-  function (df,dist,times_larger) {

              for (i in 1:(nrow(df)-1)) {

                  if (df$dist[i] > df$dist[i+1]*times_larger){
                    df<-df[-i,]
                    break       
                  }
              }
              df
            }
Run Code Online (Sandbox Code Playgroud)

显然,如果我不打破循环,它将产生错误,因为df中的行数将在此过程中发生变化.如果我在df上手动运行循环几次:

df<-cleaner(df,"dist",2)
Run Code Online (Sandbox Code Playgroud)

它将按我的要求清理.

我也尝试了不同的函数结构,并将其应用于数据框,但没有任何运气.

有没有一个很好的建议,如何重复数据框上的功能,直到它不再改变,更好的功能结构或更好的清洁方式?

任何建议都非常感谢

r data-manipulation dataframe data-cleaning

7
推荐指数
2
解决办法
827
查看次数

通过data.table(R)循环grepl()

我有一个数据集存储为data.table DT,如下所示:

print(DT)
   category            industry
1: administration      admin
2: nurse practitioner  truck
3: trucking            truck
4: administration      admin
5: warehousing         nurse
6: warehousing         admin
7: trucking            truck
8: nurse practitioner  nurse         
9: nurse practitioner  truck 
Run Code Online (Sandbox Code Playgroud)

我想将表格减少到只有行业与该类别匹配的行.我的一般方法是使用grepl()正则表达式匹配字符串'^{{INDUSTRY}}[a-z ]+$'和每一行DT$category,每个对应的行DT$industry插入在{{INDUSTRY}}正则表达式字符串中使用infuse().我很难找到一个时髦的data.table解决方案,它可以正确地循环遍历表并进行行内比较,所以我使用for循环来完成工作:

template <- "^{{IND}}[a-z ]+$"
DT[,match := FALSE,]
for (i in seq(1,length(DT$category))) {
    ind <- DT[i]$industry
    categ <- d.daily[i]$category
    if (grepl(infuse(IND=ind,template),categ)){
        DT[i]$match <- TRUE
    }
}
DT<- DT[match==TRUE]
print(DT)
       category            industry …
Run Code Online (Sandbox Code Playgroud)

regex r data.table data-cleaning

7
推荐指数
3
解决办法
1760
查看次数

Python Pandas——用前一列的值向前填充整行

pandas 开发新手。如何使用先前看到的列中包含的值向前填充 DataFrame?

独立的示例:

import pandas as pd
import numpy as np
O = [1, np.nan, 5, np.nan]
H = [5, np.nan, 5, np.nan]
L = [1, np.nan, 2, np.nan]
C = [5, np.nan, 2, np.nan]
timestamps = ["2017-07-23 03:13:00", "2017-07-23 03:14:00", "2017-07-23 03:15:00", "2017-07-23 03:16:00"]
dict = {'Open': O, 'High': H, 'Low': L, 'Close': C}
df = pd.DataFrame(index=timestamps, data=dict)
ohlc = df[['Open', 'High', 'Low', 'Close']]
Run Code Online (Sandbox Code Playgroud)

这会产生以下数据帧:

print(ohlc)
                     Open  High  Low  Close
2017-07-23 03:13:00   1.0   5.0  1.0    5.0
2017-07-23 03:14:00 …
Run Code Online (Sandbox Code Playgroud)

python dataframe pandas data-cleaning data-science

7
推荐指数
1
解决办法
3116
查看次数

使用 spacy 删除停用词

我正在清理我的data frameSumcription 中的一个列,并尝试做 3 件事:

  1. 代币化
  2. 语义化
  3. 删除停用词

    import spacy        
    nlp = spacy.load('en_core_web_sm', parser=False, entity=False)        
    df['Tokens'] = df.Sumcription.apply(lambda x: nlp(x))    
    spacy_stopwords = spacy.lang.en.stop_words.STOP_WORDS        
    spacy_stopwords.add('attach')
    df['Lema_Token']  = df.Tokens.apply(lambda x: " ".join([token.lemma_ for token in x if token not in spacy_stopwords]))
    
    Run Code Online (Sandbox Code Playgroud)

但是,当我打印例如:

df.Lema_Token.iloc[8]
Run Code Online (Sandbox Code Playgroud)

输出中仍然包含单词 attach : attach poster on the wall because it is cool

为什么它不删除停用词?

我也试过这个:

df['Lema_Token_Test']  = df.Tokens.apply(lambda x: [token.lemma_ for token in x if token not in spacy_stopwords])
Run Code Online (Sandbox Code Playgroud)

但是 strattach仍然出现。

python nlp data-cleaning spacy python-3.7

7
推荐指数
1
解决办法
1万
查看次数