簡體   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