如何将一列拆分为多个列,然后在SQL或Pandas中计算新列中的空值?
我有一个相对较大的表,有数千行和几十列。有些列是元数据,有些是数值。我遇到的问题是,某些元数据列不完整或不完整,也就是说,它缺少了a:。我想数一数,其中有多少是冒号标记后缺失的部分 如果你看下面的小例子,我会得到一个小表,告诉我在a组中,元数据在2个条目中是完整的,在其他2个条目中是不完整的。理想情况下,我还想获得一些关于某个值计数、最大值、最小值等的统计信息 如何在SQL查询或Python中执行此操作? 使用一些内置函数可能会很简单,但是,我没有正确地理解它 数据: 预期产出结果:如何将一列拆分为多个列,然后在SQL或Pandas中计算新列中的空值?,sql,database,pandas,Sql,Database,Pandas,我有一个相对较大的表,有数千行和几十列。有些列是元数据,有些是数值。我遇到的问题是,某些元数据列不完整或不完整,也就是说,它缺少了a:。我想数一数,其中有多少是冒号标记后缺失的部分 如果你看下面的小例子,我会得到一个小表,告诉我在a组中,元数据在2个条目中是完整的,在其他2个条目中是不完整的。理想情况下,我还想获得一些关于某个值计数、最大值、最小值等的统计信息 如何在SQL查询或Python中执行此操作? 使用一些内置函数可能会很简单,但是,我没有正确地理解它 数据: 预期产出结果: Group
Group MetaDataComplete Count
A Yes 2
A No 2
以下是一个例子:
1-创建数据帧
在[1]中:
作为pd进口熊猫
将numpy作为np导入
cols=['Group','MetaData','SomeValue']
数据=['A','AB:xxx',20],
[A',AB:',5],
[A',PQ:yyy',30],
[A',PQ:',2]
]
df=pd.DataFramecolumns=cols,data=data
2-具有拆分值列的新数据框
new=df[MetaData].str.split:,n=1,expand=True
df[MetaData_1]=新的[0]
df[MetaData_2]=新的[1]
3-删除旧的元数据列
df.dropcolumns=[元数据],inplace=True
4-将空字符串替换为nan并计数
df.replace,np.NaN,inplace=True
df.isnull.sum
出[1]:
第0组
SomeValue 0
元数据1 0
元数据2
数据类型:int64
以下是一个例子:
1-创建数据帧
在[1]中:
作为pd进口熊猫
将numpy作为np导入
cols=['Group','MetaData','SomeValue']
数据=['A','AB:xxx',20],
[A',AB:',5],
[A',PQ:yyy',30],
[A',PQ:',2]
]
df=pd.DataFramecolumns=cols,data=data
2-具有拆分值列的新数据框
new=df[MetaData].str.split:,n=1,expand=True
df[MetaData_1]=新的[0]
df[MetaData_2]=新的[1]
3-删除旧的元数据列
df.dropcolumns=[元数据],inplace=True
4-将空字符串替换为nan并计数
df.replace,np.NaN,inplace=True
df.isnull.sum
出[1]:
第0组
SomeValue 0
元数据1 0
元数据2
数据类型: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
如果您的计算机刚刚完成计数,您也可以尝试算法方法。只需在数据上循环并使用具有负前瞻性的正则表达式
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的角度来看,执行拆分是痛苦的,更不用说使用拆分结果时必须先执行查询,然后再查询结果: 选择 结果【组】, 结果.元数据, 结果:元价值, COUNTResults.MetaValue 从选择 [小组] 元数据, SUBSTRINGMetaData,CHARINDEX':',MetaData+1,LENMetaData作为元值 从VeryLargeTable作为结果 按结果分组。[分组], 结果.元数据, 结果:元值
从SQL的角度来看,执行拆分是痛苦的,更不用说使用拆分结果时必须先执行查询,然后再查询结果: 选择 结果【组】, 结果.元数据, 结果:元价值, COUNTResults.MetaValue 从选择 [小组] 元数据, SUBSTRINGMetaData,CHARINDEX':',MetaData+1,LENMetaData作为元值 从VeryLargeTable作为结果 按结果分组。[分组], 结果.元数据, 结果:元值
除非值可以包含冒号字符,否则没有理由使用拆分函数。我只想假设空值在技术上不是正确的单词,而是以: 您还可以使用rightMetaData,1=':'
或者假设值可以包含自己的冒号,如果您只想询问第一个冒号是否位于最后一个位置,请尝试charindex“:”,MetaData=lenMetaData。除非值可以包含冒号字符,否则没有理由使用拆分函数。我只想假设空值在技术上不是正确的单词,而是以: 您还可以使用rightMetaData,1=':'
或者假设值可以包含自己的冒号,如果您只想询问第一个冒号是否位于最后一个位置,请尝试charindex“:”,MetaData=lenMetaData。第一部分“拆分”似乎是一个重复的问题。拆分后,您可以使用groupby并计算空值的数量。第一部分拆分的可能重复似乎是一个重复的问题。拆分后,您可以使用groupby并计算空值的数量可能重复的感谢,但我认为这给出了部分答案。它没有给出未丢失元数据的计数。谢谢,但我认为这给出了部分答案。它没有给出未丢失元数据的计数。谢谢!我想这就是我要尝试的。我更愿意生成
此表包含SQL查询。谢谢!我想这就是我要尝试的。我更愿意使用SQL查询生成此表。
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