3

我已经read_csv在 J​​upyter 笔记本(Python 2)中导入了一个带有 Pandas 的制表符分隔文件,并且我提取了感兴趣的单列:

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

显然,这似乎是正则表达式的工作!但是,我不知道如何在 Pandas 中进行此操作。缺失的数据应该为空。

4

3 回答 3

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
于 2017-08-08T17:06:56.330 回答
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'}]

数据框:

  标题1 标题2 标题3 标题4
0 123 123 123 南
1 123 南 123 123

希望能帮助到你

于 2017-08-08T17:01:47.677 回答
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
于 2017-08-08T17:37:40.283 回答