从字典列表创建Pandas Dataframe,其中某些键的值缺失

时间:2017-11-17 20:56:14

标签: python list pandas dictionary dataframe

大家。

下面是我用来解析文本文件的代码:

import pandas as pd

tags = ['129','30','32','851','9730','9882'] 
rows = []

file = open('D:\\python\\redi_fix\\redi_august.txt','r') 
content = file.readlines() 
for line in content:
    for message in line.split('\t'):
        try:
            row_dict = {}
            tag,val = message.split('=')        
            if tag in tags:
                row_dict[tag]=val
                rows.append(row_dict)
        except:
            pass

从行创建pandas数据帧会产生以下结果:

129     30      32      851     9730    9882
r170557 NaN     NaN     NaN     NaN     NaN
NaN     ARCA    NaN     NaN     NaN     NaN
NaN     NaN     100     NaN     NaN     NaN
r170557 NaN     NaN     NaN     NaN     NaN
NaN     ARCA    NaN     NaN     NaN     NaN
NaN     NaN     300     NaN     NaN     NaN

看起来某个键的每个值都在不同的行上。 我努力实现的结果是所有值都在同一行 - 见下面例如:

129     30      32      851     9730    9882
r170557 ARCA    100     NaN     NaN     NaN
r170557 ARCA    300     NaN     NaN     NaN

2 个答案:

答案 0 :(得分:4)

如果你想"崩溃"您的NaN,您可以groupby / agg执行first + last

df.groupby(df['129'].notnull().cumsum(), as_index=False).agg('first')

       129    30     32  851  9730  9882
0  r170557  ARCA  100.0  NaN   NaN   NaN
1  r170557  ARCA  300.0  NaN   NaN   NaN

答案 1 :(得分:4)

使用结果数据框,我们需要sorteddropna

result.apply(lambda x : sorted(x,key=pd.isnull)).dropna(thresh=1)
Out[1171]: 
       129    30     32  851  9730  9882
0  r170557  ARCA  100.0  NaN   NaN   NaN
1  r170557  ARCA  300.0  NaN   NaN   NaN