Python - Pandas - 从DataFrame中提取列名

时间:2017-08-08 16:32:45

标签: python python-2.7 pandas

我在Jupyter笔记本(Python 2)中使用Pandas read_csv导入了制表符分隔文件,并且我已经提取了感兴趣的单列

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

我感兴趣的专栏的格式如下:

header1=123;header2=123;header3=123

此DataFrame中的每一行都不是每个标题,我也不知道完整的标题集。我的数据值123s都是数字。

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

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

# 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

显然,这似乎是正常表达的工作!但是,我对如何在熊猫中解决这个问题感到茫然。丢失的数据应为null。

谢谢!

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分: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)

输出:

Dict:

[ {'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

希望有所帮助

答案 2 :(得分:0)

使用translation_dict = {"": "Null", " ": "Null", "N/A": "Null", "Off": "No", "On": "Yes"} for counter in range(len(value_list)): old_value = str(value_list[counter]).strip('"') if old_value in translation_dict: value_list[counter] = translation_dict[old_value] print counter, value_list[counter]

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