繁体   English   中英

如何将一列拆分为多列,然后在SQL或Pandas中计算新列中的空值?

[英]How to split a column into multiple columns and then count the null values in the new column in SQL or Pandas?

我有一个相对较大的表,其中包含数千行和数十列。 一些列是元数据,其他列是数值。 我的问题是,某些元数据列不完整或部分不完整,即它在“:”之后丢失了字符串。 我想对冒号后缺少的部分进行计数。

如果您看下面的微型示例,我应该得到一张小表,告诉我在A组中,MetaData对于2个条目是完整的,而对于其他2个条目则是不完整的(在“:”之后丢失)。 理想情况下,我还想获取一些SomeValue的统计信息(计数,最大值,最小值等)。

如何在SQL查询或Python Pandas中执行此操作? 使用某些内置函数可能很简单,但是,我做得不好。

数据:

Group MetaData SomeValue
A     AB:xxx    20
A     AB:        5
A     PQ:yyy    30
A     PQ:        2

预期输出结果:

Group MetaDataComplete Count
A     Yes               2
A     No                2

没有理由使用拆分函数(除非该值可以包含冒号字符。)我只是假设“空”值(从技术上讲不是正确的词)以:结尾。

select
    "Group",
    case when MetaData like '%:' then 'Yes' else 'No' end as MetaDataComplete,
    count(*) as "Count"
from T
group by "Group", case when MetaData like '%:' then 'Yes' else 'No' end

您还可以使用right(MetaData, 1) = ':'

或者假设值可以包含自己的冒号,如果您只是想问第一个冒号是否位于最后一个位置 ,请尝试使用charindex(':', MetaData) = len(MetaData)

这是一个例子:

## 1- Create Dataframe
In [1]:
import pandas as pd
import numpy as np
cols = ['Group', 'MetaData', 'SomeValue']
data = [['A', 'AB:xxx', 20],
        ['A', 'AB:', 5],
        ['A', 'PQ:yyy', 30],
        ['A', 'PQ:', 2]
       ]
df = pd.DataFrame(columns=cols, data=data)

# 2- New data frame with split value columns 
new = df["MetaData"].str.split(":", n = 1, expand = True) 

df["MetaData_1"]= new[0] 
df["MetaData_2"]= new[1]

# 3- Dropping old MetaData columns 
df.drop(columns =["MetaData"], inplace = True)

## 4- Replacing empty string by nan and count them
df.replace('',np.NaN, inplace=True)
df.isnull().sum()

Out [1]:

Group         0
SomeValue     0
MetaData_1    0
MetaData_2    2
dtype: int64

如果您只是想算一下,也可以尝试算法方法。 只需循环数据并使用带有负前瞻性的正则表达式即可。

import pandas as pd
import re

pattern = '.*:(?!.)' # detects the strings of the missing data form
missing = 0
not_missing = 0
for i in data['MetaData'].tolist():
    match = re.findall(pattern, i)
    if match:
        missing += 1
    else:
        not_missing += 1

从SQL的角度来看,执行拆分很痛苦,更不用说使用拆分结果了,因为必须先执行查询然后查询结果:

SELECT
  Results.[Group],
  Results.MetaData,
  Results.MetaValue,
  COUNT(Results.MetaValue)
FROM (SELECT
  [Group]
  MetaData,
  SUBSTRING(MetaData, CHARINDEX(':', MetaData) + 1, LEN(MetaData)) AS MetaValue
FROM VeryLargeTable) AS Results
GROUP BY Results.[Group],
         Results.MetaData,
         Results.MetaValue

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM