繁体   English   中英

根据字典中的键对在数据框中创建不同的列

[英]Creating different columns in dataframe from a key pair in a dictionary

这是我创建的词典的一部分:

defaultdict (int,
         {"['por', 'rus']": 80,
         "['nld', 'slv']": 4,
         "['jpn', 'pol']": 48,
         "['ces', 'epo']": 4,
         "['oci', 'ron']": 4,
         "['lit', 'mkd']": 2,
         "['deu', 'ewe']": 2,
         "['cat', 'ron']": 4,
         "['ces', 'ita']": 18,
         "['est', 'fra']": 14,
         "['hin', 'mal']": 4,

我想要3列,column1:第一个键,column2:第二个键,column3:值。

当我创建一个数据框时:

pairs_df = pd.DataFrame(list(pairs.iteritems()), columns = ['column1','column2'])
pairs_df.head()

输出:

           column1  column2
0   ['por', 'rus']       80
1   ['est', 'fra']       14
2   ['nld', 'slv']        4
3   ['jpn', 'pol']       48
4   ['ces', 'epo']        4
5   ['hin', 'mal']        4
6   ['oci', 'ron']        4
7   ['lit', 'mkd']        2
8   ['deu', 'ewe']        2
9   ['cat', 'ron']        4
10  ['ces', 'ita']       18

键进入一列,但我无法将它们分成树形列。

这是你想要的吗?

import re

mydict=  {"['por', 'rus']": 80,
         "['nld', 'slv']": 4,
         "['jpn', 'pol']": 48,
         "['ces', 'epo']": 4,
         "['oci', 'ron']": 4,
         "['lit', 'mkd']": 2,
         "['deu', 'ewe']": 2,
         "['cat', 'ron']": 4,
         "['ces', 'ita']": 18,
         "['est', 'fra']": 14,
         "['hin', 'mal']": 4}


# this is where you seem to be stuck
for k,v in mydict.iteritems():
    print k,v    # keys are still strings, not lists

# this is the resolution, separation of the keys into two strings    
for k,v in mydict.iteritems():
    a=re.findall('\w{3}',k) 
    print a[0],a[1],v

输出:

['por', 'rus'] 80
['nld', 'slv'] 4
['jpn', 'pol'] 48
['ces', 'epo'] 4
['oci', 'ron'] 4
['lit', 'mkd'] 2
['deu', 'ewe'] 2
['cat', 'ron'] 4
['ces', 'ita'] 18
['est', 'fra'] 14
['hin', 'mal'] 4
por rus 80
nld slv 4
jpn pol 48
ces epo 4
oci ron 4
lit mkd 2
deu ewe 2
cat ron 4
ces ita 18
est fra 14
hin mal 4

现在,您可以根据需要将它们追加到列表中:

 x,y,z=[],[],[]
    for k,v in mydict.iteritems():
        a=re.findall('\w{3}',k) 
        x.append(a[0])
        y.append(a[1])
        z.append(v)
print x,y,z

或者,如果您喜欢熊猫数据框:

import pandas as pd
df = pd.DataFrame({'a': x, 'b': y,'c':z})
print df

输出:

['por', 'nld', 'jpn', 'ces', 'oci', 'lit', 'deu', 'cat', 'ces', 'est', 'hin'] ['rus', 'slv', 'pol', 'epo', 'ron', 'mkd', 'ewe', 'ron', 'ita', 'fra', 'mal'] [80, 4, 48, 4, 4, 2, 2, 4, 18, 14, 4]
      a    b   c
0   por  rus  80
1   nld  slv   4
2   jpn  pol  48
3   ces  epo   4
4   oci  ron   4
5   lit  mkd   2
6   deu  ewe   2
7   cat  ron   4
8   ces  ita  18
9   est  fra  14
10  hin  mal   4
import pandas as pd
from collections import defaultdict
from ast import literal_eval

pairs = defaultdict (int,
            {"['por', 'rus']": 80,
             "['nld', 'slv']": 4,
             "['jpn', 'pol']": 48,
             "['ces', 'epo']": 4,
             "['oci', 'ron']": 4,
             "['lit', 'mkd']": 2,
             "['deu', 'ewe']": 2,
             "['cat', 'ron']": 4,
             "['ces', 'ita']": 18,
             "['est', 'fra']": 14,
             "['hin', 'mal']": 4})


df = pd.DataFrame(list(pairs.iteritems()), columns = ['column1','column2'])
print df
           column1  column2
0   ['por', 'rus']       80
1   ['est', 'fra']       14
2   ['nld', 'slv']        4
3   ['jpn', 'pol']       48
4   ['ces', 'epo']        4
5   ['hin', 'mal']        4
6   ['oci', 'ron']        4
7   ['lit', 'mkd']        2
8   ['deu', 'ewe']        2
9   ['cat', 'ron']        4
10  ['ces', 'ita']       18

print type(df.at[0,'column1'])
<type 'str'>

你可以先改变string list ,以listliteral_eval ,然后创建DataFrame from_records和最后concat column2

#change type string to list
df['column1'] = df['column1'].apply(literal_eval)
print df
       column1  column2
0   [por, rus]       80
1   [est, fra]       14
2   [nld, slv]        4
3   [jpn, pol]       48
4   [ces, epo]        4
5   [hin, mal]        4
6   [oci, ron]        4
7   [lit, mkd]        2
8   [deu, ewe]        2
9   [cat, ron]        4
10  [ces, ita]       18

print type(df.at[0,'column1'])
<type 'list'>
df1 = pd.DataFrame.from_records([x for x in df['column1']], columns=['a','b'])
print df1
      a    b
0   por  rus
1   est  fra
2   nld  slv
3   jpn  pol
4   ces  epo
5   hin  mal
6   oci  ron
7   lit  mkd
8   deu  ewe
9   cat  ron
10  ces  ita

print pd.concat([df1, df['column2']], axis=1)
      a    b  column2
0   por  rus       80
1   est  fra       14
2   nld  slv        4
3   jpn  pol       48
4   ces  epo        4
5   hin  mal        4
6   oci  ron        4
7   lit  mkd        2
8   deu  ewe        2
9   cat  ron        4
10  ces  ita       18

或使用str.stripreplace以清洗column1 ,然后通过splitconcat column2创建新的DataFrame

df['column1'] = df['column1'].str.strip('[]').str.replace("'","")
print df
     column1  column2
0   por, rus       80
1   est, fra       14
2   nld, slv        4
3   jpn, pol       48
4   ces, epo        4
5   hin, mal        4
6   oci, ron        4
7   lit, mkd        2
8   deu, ewe        2
9   cat, ron        4
10  ces, ita       18
df1 = df['column1'].str.split(",", expand=True)
df1.columns = ['a','b']
print df1
      a     b
0   por   rus
1   est   fra
2   nld   slv
3   jpn   pol
4   ces   epo
5   hin   mal
6   oci   ron
7   lit   mkd
8   deu   ewe
9   cat   ron
10  ces   ita

print pd.concat([df1, df['column2']], axis=1)
      a     b  column2
0   por   rus       80
1   est   fra       14
2   nld   slv        4
3   jpn   pol       48
4   ces   epo        4
5   hin   mal        4
6   oci   ron        4
7   lit   mkd        2
8   deu   ewe        2
9   cat   ron        4
10  ces   ita       18

此解决方案将dict理解与eval和功能from_records

import pandas as pd
from collections import defaultdict

pairs = defaultdict (int,
            {"['por', 'rus']": 80,
             "['nld', 'slv']": 4,
             "['jpn', 'pol']": 48,
             "['ces', 'epo']": 4,
             "['oci', 'ron']": 4,
             "['lit', 'mkd']": 2,
             "['deu', 'ewe']": 2,
             "['cat', 'ron']": 4,
             "['ces', 'ita']": 18,
             "['est', 'fra']": 14,
             "['hin', 'mal']": 4})

rec = [ eval(x[0]) + [x[1]] for x in pairs.iteritems()]
print rec
[['por', 'rus', 80], ['est', 'fra', 14], ['nld', 'slv', 4], ['jpn', 'pol', 48], 
 ['ces', 'epo', 4],  ['hin', 'mal', 4],  ['oci', 'ron', 4], ['lit', 'mkd', 2], 
 ['deu', 'ewe', 2],  ['cat', 'ron', 4],  ['ces', 'ita', 18]]

print pd.DataFrame.from_records(rec, columns=['a','b','c'])
      a    b   c
0   por  rus  80
1   est  fra  14
2   nld  slv   4
3   jpn  pol  48
4   ces  epo   4
5   hin  mal   4
6   oci  ron   4
7   lit  mkd   2
8   deu  ewe   2
9   cat  ron   4
10  ces  ita  18

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM