处理一栏文字档案中的资料遗失

ej_f

我有一个像这样的数据集:

IM,XX
IS,YY
SG,3
OTPL,90
TTPL,90
IM,AA
IS,BB
SG,3
TTPL,50
IM,ZZ
IS,CC
OTPL,10

每行包含一key,value对,我需要将其转换为表格格式以进行一些分析。所述IM变量代表一个行的索引和以下参数的列。对我而言,棘手的部分是考虑可能的缺失值。预期结果是:

IM  IS  OTPL    SG  TTPL  
XX  YY    90     3    90    
AA  BB  null     3    50    
ZZ  CC    10  null  null   

“注意空值”。

我有一个解决方案,但效率不高,当数据集很大时,这不是合适的方法。我使用以下策略:

  1. 使用awk,为每个寄存器(行)添加一个额外的索引。它创建一个计数器n,并在IM出现时递增

    $ awk -F, 'BEGIN{n = 0}{ if($1 == "IM"){n += 1} print n","$0}' inputdata.txt
    1,IM,XX
    1,IS,YY
    1,SG,3
    1,OTPL,90
    1,TTPL,90
    2,IM,AA
    2,IS,BB
    2,SG,3
    2,TTPL,50
    3,IM,ZZ
    3,IS,CC
    3,OTPL,10
    
  2. 接下来,使用阅读以前的结果pandas,申请groupby通过上述指标,并创建应用新表concatpivot子表:

    In[1]:import pandas as pd
          gb = pd.read_csv("outdata.txt", names = ["id","key","value"]).groupby("id")
          res = pd.concat([df.pivot(index="id", columns='key', values='value') for g, df in gb])
          res
    Out[1]: 
        IM  IS OTPL   SG TTPL
    id                       
    1   XX  YY   90    3   90
    2   AA  BB  NaN    3   50
    3   ZZ  CC   10  NaN  NaN
    

最后一步非常昂贵。

有人遇到过类似的问题吗?仅通过命令行解决此问题会很好。

提前致谢!

最大容量

[更新]纯GAWK解决方案:

BEGIN {
    FS=OFS=","
    n = 0
}
{
    if($1 == "IM") {
        n++
    }
    keys[$1]++
    vals[n,$1]=$2
}
END {
    l=asorti(keys, copy)
    printf "id"
    for (i=1; i<=l; i++) {
        printf "%s%s", FS, copy[i]
    }
    print ""

    for (i=1; i<=n; i++) {
        printf "%s", i
        for (k=1; k<=l; k++) {
            printf "%s%s", FS, vals[i,copy[k]] 
        }
        print ""
    }
}

输出:

{ .data }  » awk -f prg.awk data.csv
id,IM,IS,OTPL,SG,TTPL
1,XX,YY,90,3,90
2,AA,BB,,3,50
3,ZZ,CC,10,,

[OLD]熊猫解决方案:

我认为您可以只使用pivot_table()而不是groupby()+ concat()

In [105]: df
Out[105]:
    id   key val
0    1    IM  XX
1    1    IS  YY
2    1    SG   3
3    1  OTPL  90
4    1  TTPL  90
5    2    IM  AA
6    2    IS  BB
7    2    SG   3
8    2  TTPL  50
9    3    IM  ZZ
10   3    IS  CC
11   3  OTPL  10

In [106]: df.pivot_table(index='id', columns='key', values='val', aggfunc='sum', fill_value=np.nan)
Out[106]:
key  IM  IS OTPL   SG TTPL
id
1    XX  YY   90    3   90
2    AA  BB  NaN    3   50
3    ZZ  CC   10  NaN  NaN

pivot()如果您没有重复项(例如在示例数据集中):

In [109]: df.pivot(index='id', columns='key', values='val')
Out[109]:
key  IM  IS  OTPL    SG  TTPL
id
1    XX  YY    90     3    90
2    AA  BB  None     3    50
3    ZZ  CC    10  None  None

NaNs相同,而不是Nones:

In [110]: df.pivot(index='id', columns='key', values='val').fillna(np.nan)
Out[110]:
key  IM  IS OTPL   SG TTPL
id
1    XX  YY   90    3   90
2    AA  BB  NaN    3   50
3    ZZ  CC   10  NaN  NaN

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

只处理第一栏中的文字?

来自分类Dev

枢纽分析资料超过一栏

来自分类Dev

将一栏中的文字替换为另一栏中的字典

来自分类Dev

一栏中的表格,另一栏中的文字段落

来自分类Dev

计算Excel中一栏中的文字出现次数

来自分类Dev

在MSSQL中按一栏排序

来自分类Dev

MySQL搜索文本在一栏中

来自分类Dev

Excel:表中的第一栏

来自分类Dev

一栏减去一栏

来自分类Dev

Android应用程式写入文字档案

来自分类Dev

Android应用程式写入文字档案

来自分类Dev

计算一栏中数字的频率,而等于另一栏中的文本

来自分类Dev

区分一栏

来自分类Dev

js砌体卡在无限滚动的一栏中

来自分类Dev

在热图()的一栏中反转“热量”

来自分类Dev

替换CSV第一栏中的数据

来自分类Dev

在一栏中合并日期和小时

来自分类Dev

熊猫:递增计数一栏中的事件

来自分类Dev

在TableView的一栏中显示多个角色

来自分类Dev

如何删除“。”后的字符。(点)在第一栏中?

来自分类Dev

我如何摆脱最后一栏中的零

来自分类Dev

一栏中特定数字的总和(Google表格)

来自分类Dev

如何删除“。”后的字符。(点)在第一栏中?

来自分类Dev

表格中的最后一栏不可点击

来自分类Dev

在一栏中对数字/文本进行排序

来自分类Dev

从Excel第一栏中获取错误的数值

来自分类Dev

计算文件第一栏中的出现次数

来自分类Dev

在查询中为一栏写CASE条件

来自分类Dev

每页报告一栏