如何将熊猫系列分成关键值?

时间:2016-07-15 06:46:09

标签: python dataframe key

我想将pandas系列分为键和值对。我的程序正在将它转换为键和值对,但我希望这个键和值格式良好。

输入文本文件包含以下数据:

INPUT.TXT -

3=123|4=88|5=M|8=75|9=29
3=38|4=13|5=I|8=17.3|9=10|1021=0|854=p|394=7.73|474=7.7477558

程序编码 -

    df = pd.read_csv(inputfile, index_col=None, names=['text'])
    df_list = df.values.T.tolist()
    s = df.text.str.split('|')
    splited_list = s.values.T.tolist()
    s1 = pd.Series(splited_list)
    ds = [dict(w.split('=', 1) for w in x) for x in s1]
    p = pd.DataFrame.from_records(ds)
    p1 = p.replace(np.nan,'n/a', regex=True)
    st = p1.stack(level=0,dropna=False)
    dfs = [g for i, g in st.groupby(level=0)]
    dfs_length = len(dfs)
    i = 0
    while i < dfs_length:
       #index of each column
       print '\nindex[%d]'%i
       for k,v in dfs[i].iteritems():
          print k,' : ',v
       i = i + 1

这会产生以下输出:

输出 -

index[0]
(0, '1021')  :  n/a
(0, '3')  :  123
(0, '394')  :  n/a
(0, '4')  :  88
(0, '474')  :  n/a
(0, '5')  :  M
(0, '8')  :  75
(0, '854')  :  n/a
(0, '9')  :  29

index[1]
(1, '1021')  :  0
(1, '3')  :  38
(1, '394')  :  7.73
(1, '4')  :  13
(1, '474')  :  7.7477558
(1, '5')  :  I
(1, '8')  :  17.3
(1, '854')  :  p
(1, '9')  :  10

我想要其他格式的输出。我希望在每个结果的最后都有这个不适用的内容,如果存在,我想删除键的索引和括号。输出内容也应与输入文件中可用的顺序相同。

预期产出:

index[0]
3       123
4       88
5       M
8       75
9       29
1021    n/a
394     n/a
474     n/a
854     n/a

index[1]
3       38
4       13
5       I
8       17.3
9       10
1021    0
854     p    
394     7.73
474     7.7477558

有关如何获得此类输出的任何建议?

1 个答案:

答案 0 :(得分:0)

我可以回答你问题的一半。要删除括号和索引,您需要稍微调整代码,例如:

i = 0
while i < len(dfs):    
    #index of each column
    print ('\nindex[%d]'%i)
    for (_,k),v in dfs[i].iteritems():
        print (k,' : ',v)
    i = i + 1

结果如下:

index[0]
1021  :  n/a
3  :  123
394  :  n/a
4  :  88
474  :  n/a
5  :  M
8  :  75
854  :  n/a
9  :  29

index[1]
1021  :  0
3  :  38
394  :  7.73
4  :  13
474  :  7.7477558
5  :  I
8  :  17.3
854  :  p
9  :  10

最后,关于输出的顺序,解决方案将改变这一行:

ds = [dict(w.split('=', 1) for w in x) for x in s1]

因为s1仍包含正确的顺序,而ds不包含:

S1

0                       [3=123, 4=88, 5=M, 8=75, 9=29]
1    [3=38, 4=13, 5=I, 8=17.3, 9=10, 1021=0, 854=p,...
dtype: object

DS

[{'3': '123', '4': '88', '5': 'M', '8': '75', '9': '29'},
 {'1021': '0',
  '3': '38',
  '394': '7.73',
  '4': '13',
  '474': '7.7477558',
  '5': 'I',
  '8': '17.3',
  '854': 'p',
  '9': '10'}]

在我看来,dict的键被自动排序为字符串,这解释了为什么1021在3之前出现。我虽然通过升序对它们进行排序,但这不会产生从txt数据中请求的顺序。因此,我不知道解决方案,我也很好奇答案。