从 DataFrame 中提取自定义 header 列名称,用 NA 估算缺失的列
Extract custom header column names from DataFrame, impute missing columns with NA
我在 Jupyter notebook (Python 2) 中导入了一个 tab-delimited 文件 Pandas read_csv
,并且我提取了感兴趣的一列:
rawData = pd.read_csv(filename, delim_whitespace = True, header = 20)
columnOfInterest = rawData.ix[:, 9]
我感兴趣的专栏格式是这样的:
header1=123;header2=123;header3=123
并非此 DataFrame 中的每一行都有每个 header,而且我不知道可能的 header 的完整集合。 “123”,我的数据值,都是数字。
使用 ;
作为分隔符拆分列中的元素后,我所有行的列数等于行中值的数量,这在整个数据集中不统一(参差不齐) ).我想将其转换为具有缺失值的矩阵。
我想做的是从我的 DataFrame 中取出每一行,提取 header 信息,如果 header 标签是新的(即它不存在于任何已处理的行)然后我想将它添加到我的列名列表中。当然,我希望从行中删除 header 名称和等号,并且我希望我的数据都在适当的位置(因此,使用附加到每个数据的 header 信息value 将值放在适当的列中)。所以,我想要这样的东西:
# Original data frame, first 2 rows
['header1=123', 'header2=123', 'header3=123'] # <--- no header4
['header1=123', 'header3=123', 'header4=123'] # <--- no header2
# New data frame, first 2 rows plus column names
header1 header2 header3 header4
123 123 123 null # <--- header4 == null
123 null 123 123 # <--- header2 == null
显然,这似乎是正则表达式的工作!但是,我不知道如何在 Pandas 中解决这个问题。缺失数据应为空。
如果你有像
这样的数据框
df = pd.DataFrame([['header1=123', 'header2=123', 'header3=123'],['header1=123', 'header3=123', 'header4=123']])
然后,您可以按 =
拆分数据,然后创建字典,pd.DataFrame 构造函数将处理其余部分,即
new = [[j.split('=') for j in i] for i in df.values ]
di=[{k:j for k,j in i} for i in new]
new_df = pd.DataFrame(di)
输出:
字典:
[ {'header1': '123', 'header2': '123', 'header3': '123'},
{'header1': '123', 'header3': '123', 'header4': '123'}]
数据帧:
header1 header2 header3 header4
0 123 123 123 NaN
1 123 NaN 123 123
希望对您有所帮助
您可以使用嵌套的 list comprehension
转换为 dict
,然后仅使用 DataFrame
构造函数:
print (df)
col
0 header1=123;header2=123;header3=123
1 header1=123;header3=123;header4=123
d = [dict([y.split('=') for y in x]) for x in df['col'].str.split(';').values.tolist()]
print (d)
[{'header1': '123', 'header3': '123', 'header2': '123'},
{'header1': '123', 'header4': '123', 'header3': '123'}]
df = pd.DataFrame(d)
print (df)
header1 header2 header3 header4
0 123 123 123 NaN
1 123 NaN 123 123
如果值被 ;
分割,解决方案更简单:
print (df)
col
0 [header1=123, header2=123, header3=123]
1 [header1=123, header3=123, header4=123]
d = [dict([y.split('=') for y in x]) for x in df['col'].values.tolist()]
df = pd.DataFrame(d)
print (df)
header1 header2 header3 header4
0 123 123 123 NaN
1 123 NaN 123 123
使用apply
In [1178]: df.col.apply(lambda x: pd.Series(
dict([tuple(y.split('=')) for y in x.split(';')])))
Out[1178]:
header1 header2 header3 header4
0 123 123 123 NaN
1 123 NaN 123 123
或者,
In [1532]: df.col.apply(lambda x: pd.Series(
dict(map(lambda y: tuple(y.split('=')), x.split(';')))))
Out[1532]:
header1 header2 header3 header4
0 123 123 123 NaN
1 123 NaN 123 123
我在 Jupyter notebook (Python 2) 中导入了一个 tab-delimited 文件 Pandas read_csv
,并且我提取了感兴趣的一列:
rawData = pd.read_csv(filename, delim_whitespace = True, header = 20)
columnOfInterest = rawData.ix[:, 9]
我感兴趣的专栏格式是这样的:
header1=123;header2=123;header3=123
并非此 DataFrame 中的每一行都有每个 header,而且我不知道可能的 header 的完整集合。 “123”,我的数据值,都是数字。
使用 ;
作为分隔符拆分列中的元素后,我所有行的列数等于行中值的数量,这在整个数据集中不统一(参差不齐) ).我想将其转换为具有缺失值的矩阵。
我想做的是从我的 DataFrame 中取出每一行,提取 header 信息,如果 header 标签是新的(即它不存在于任何已处理的行)然后我想将它添加到我的列名列表中。当然,我希望从行中删除 header 名称和等号,并且我希望我的数据都在适当的位置(因此,使用附加到每个数据的 header 信息value 将值放在适当的列中)。所以,我想要这样的东西:
# Original data frame, first 2 rows
['header1=123', 'header2=123', 'header3=123'] # <--- no header4
['header1=123', 'header3=123', 'header4=123'] # <--- no header2
# New data frame, first 2 rows plus column names
header1 header2 header3 header4
123 123 123 null # <--- header4 == null
123 null 123 123 # <--- header2 == null
显然,这似乎是正则表达式的工作!但是,我不知道如何在 Pandas 中解决这个问题。缺失数据应为空。
如果你有像
这样的数据框df = pd.DataFrame([['header1=123', 'header2=123', 'header3=123'],['header1=123', 'header3=123', 'header4=123']])
然后,您可以按 =
拆分数据,然后创建字典,pd.DataFrame 构造函数将处理其余部分,即
new = [[j.split('=') for j in i] for i in df.values ]
di=[{k:j for k,j in i} for i in new]
new_df = pd.DataFrame(di)
输出:
字典:
[ {'header1': '123', 'header2': '123', 'header3': '123'}, {'header1': '123', 'header3': '123', 'header4': '123'}]
数据帧:
header1 header2 header3 header4 0 123 123 123 NaN 1 123 NaN 123 123
希望对您有所帮助
您可以使用嵌套的 list comprehension
转换为 dict
,然后仅使用 DataFrame
构造函数:
print (df)
col
0 header1=123;header2=123;header3=123
1 header1=123;header3=123;header4=123
d = [dict([y.split('=') for y in x]) for x in df['col'].str.split(';').values.tolist()]
print (d)
[{'header1': '123', 'header3': '123', 'header2': '123'},
{'header1': '123', 'header4': '123', 'header3': '123'}]
df = pd.DataFrame(d)
print (df)
header1 header2 header3 header4
0 123 123 123 NaN
1 123 NaN 123 123
如果值被 ;
分割,解决方案更简单:
print (df)
col
0 [header1=123, header2=123, header3=123]
1 [header1=123, header3=123, header4=123]
d = [dict([y.split('=') for y in x]) for x in df['col'].values.tolist()]
df = pd.DataFrame(d)
print (df)
header1 header2 header3 header4
0 123 123 123 NaN
1 123 NaN 123 123
使用apply
In [1178]: df.col.apply(lambda x: pd.Series(
dict([tuple(y.split('=')) for y in x.split(';')])))
Out[1178]:
header1 header2 header3 header4
0 123 123 123 NaN
1 123 NaN 123 123
或者,
In [1532]: df.col.apply(lambda x: pd.Series(
dict(map(lambda y: tuple(y.split('=')), x.split(';')))))
Out[1532]:
header1 header2 header3 header4
0 123 123 123 NaN
1 123 NaN 123 123