[英]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.