我有一个相对较大的表,其中包含数千行和数十列。一些列是元数据,其他列是数值。我的问题是,某些元数据列不完整或部分不完整,即它在“:”之后丢失了字符串。我想对冒号后缺少的部分进行计数。
如果您看下面的微型示例,我应该得到一张小表,该表告诉我在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
答案 0 :(得分: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 :(得分:0)
这里是一个例子:
## 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
答案 2 :(得分:0)
如果只是算数,您也可以尝试算法方法。只需循环数据并使用带有负前瞻性的正则表达式即可。
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
答案 3 :(得分:0)
从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