Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从DataFrame中提取自定义标题列名,用NA填充缺少的列_Python_Pandas_Python 2.7_Csv_Header Row - Fatal编程技术网

Python 从DataFrame中提取自定义标题列名,用NA填充缺少的列

Python 从DataFrame中提取自定义标题列名,用NA填充缺少的列,python,pandas,python-2.7,csv,header-row,Python,Pandas,Python 2.7,Csv,Header Row,我已经在Jupyter笔记本(Python 2)中导入了一个带有Pandasread\u csv的制表符分隔文件,并提取了感兴趣的单列: rawData = pd.read_csv(filename, delim_whitespace = True, header = 20) columnOfInterest = rawData.ix[:, 9] 我感兴趣的专栏的格式如下: header1=123;header2=123;header3=123 并非此数据帧中的每一行都有每个标题,我不知道

我已经在Jupyter笔记本(Python 2)中导入了一个带有Pandas
read\u csv
的制表符分隔文件,并提取了感兴趣的单列:

rawData = pd.read_csv(filename, delim_whitespace = True, header = 20)
columnOfInterest = rawData.ix[:, 9] 
我感兴趣的专栏的格式如下:

header1=123;header2=123;header3=123
并非此数据帧中的每一行都有每个标题,我不知道可能的标题的完整集合。我的数据值“123”都是数字

使用
拆分列中的元素后
作为我的分隔符,我的所有行的列数都等于行中的值数,这在整个数据集中是不一致的(参差不齐)。我想把它转换成一个缺少值的矩阵

我想做的是从我的数据框中获取每一行,提取标题信息,如果标题标签是新的(即,它不存在于任何已处理的行中),那么我想将它添加到我的列名列表中。当然,我希望从行中删除标题名和等号,并希望所有数据都位于正确的位置(因此,使用附加到每个数据值的标题信息将值放置在正确的列中)。所以,我想要这样的东西:

# 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
#原始数据帧,前两行

['header1=123','header2=123','header3=123']#如果您有类似于

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':'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 校长1校长2校长3校长4 0 123南 11223南123123
希望有帮助

您可以使用嵌套的
列表理解
转换为
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
或者


神圣的摩西!太好了,非常感谢。哦,还有漂亮的图灵化身!谢谢你很乐意帮忙。如果答案有帮助,请投票并接受!我早些时候试过投票,但我的代表分数不够高。有人向上投票了我的问题,把我带过了门槛,所以现在我可以向上投票了!谢谢你的回复!我尝试了您建议的第二个块(已经对值进行了拆分),但我无法像在df上那样使其正常工作。我将“col”替换为:这一切都很完美。再次感谢
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