2017-04-16 200 views
1

我在我从XML解析单个数据帧中的以下数据解析熊猫数据帧

index        xml_data  
0         \n  
1        sessionKey 
2   JKX6G3_07092016_1476953673631 
3         \n  
4         Number 
5         JKX6G3 
6         \n  
7       CreateDate 
8       1468040400000 
9         \n  
10        Id 
11        83737626 
12          1 
13         \n  
14        customerAge 
15          64 
16          1 

我喜欢让每一行后“\ n”个与列相关联的列和值是下一个排例如:

sessionKey Number CreateDate Id Age 

JKX6G3_07092016_1476953673631 JKX6G3 1.46804E+12 83737626 64 

是否有这样做比一个更优雅的方式:在doc_df.itertuples() 为行: 并通过各行会和分析?

回答

3

我会去找\n的位置,并添加一个查找键,并添加值2。然后建立一个数组和一个后续的数据帧

v = df.xml_data.values 
a, b = np.where(v == '\\n')[0][None, :] + [[1], [2]] 
pd.DataFrame([v[b]], columns=v[a]) 

         sessionKey Number  CreateDate  Id customerAge 
0 JKX6G3_07092016_1476953673631 JKX6G3 1468040400000 83737626   64 
+0

完美!正是我在找什么。谢谢! –

2
import pandas as pd 
import numpy as np 

# set dataframe 
... 

# get columns name 
columns = [] 
count_n = 0 
for i in range(0, len(df)-1): 
    if (df.iloc[i]['xml_data'] == '\\n'): 
     columns.append(df.iloc[i+1]['xml_data']) 
     count_n += 1 

# generate new df  
new_df = pd.DataFrame(columns = columns, index = np.arange(count_n)) 
j = 0 
count = 0 
# set values 
for i in range(0, len(df)-2): 
    if (df.iloc[i]['xml_data'] == '\\n'): 
     new_df.iloc[j][df.iloc[i+1]['xml_data']] = df.iloc[i+2]['xml_data'] 
     count += 1 
     if count == len(new_df): 
      count = 0 
      j += 1 

new_df.dropna(inplace=True) 

print(new_df) 

结果:

     sessionKey Number  CreateDate  Id customerAge 
0 JKX6G3_07092016_1476953673631 JKX6G3 1468040400000 83737626   64 
+0

这是我也想到的解决方案,但@piRSquared解决方案就是我一直在寻找的解决方案。 –