2017-08-08 124 views
2

我已经导入与Jupyter笔记本(Python的2)熊猫read_csv制表符分隔的文件中提取列名,我已经提取出的关注的Python - 熊猫 - 从数据帧

rawData = pd.read_csv(filename, delim_whitespace = True, header = 20) 
columnOfInterest = rawData.ix[:, 9] 

格式的单柱我感兴趣的列如下所示:

header1=123;header2=123;header3=123 

并非此DataFrame中的每一行都有每个标题,并且我不知道可能的标题的完整集合。 123,我的数据值都是数字。

将列中的元素分开使用后;作为我的分隔符,我所有的行都有许多列等于行中值的数量,这在数据集中是不统一的。我想将其转换为缺少值的矩阵。

我想要做的是从我的DataFrame中取出每一行,提取标题信息,如果标题标签是新的(即它不存在于已处理的任何行中),那么我会喜欢将它添加到我的列名称列表中。当然,我希望从行中删除标题名称和等号,并且我希望我的数据都处于适当的位置(所以,使用附加到每个数据值的标题信息将值放在适当的列中)。所以,我想看起来像这样的东西:

# 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 

显然,这似乎是一个正则表达式的工作!然而,我对如何在熊猫中去解决这个问题感到不知所措。缺失的数据应该为空。

谢谢!

回答

2

如果你有数据帧像

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 

希望它可以帮助

+0

圣摩西!这很完美,非常感谢。哦,还有漂亮的图灵头像! –

+0

非常感谢您的帮助。做upvote并接受答案,如果有帮助 – Dark

+0

完成!我早些时候尝试过投票,但我没有足够高的代表分数。有人提出了我的问题,让我跨入门槛,所以现在我可以高兴起来! –

3

您可以使用嵌套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 

如果值由;分裂,解决方案simplier:

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 
+0

感谢您的回应!我尝试了你建议的第二个模块(已经分割了数值),我无法完全按照原来的方式工作。我用'替换了'col',并且这一切都很完美。再次感谢 –

0

使用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