如何从不同列的行中在数据框中创建新列?

亚历山德拉(Alexandra Glorioso)

这是我当前的数据框:

>>>df = {'most_exhibitions' : pd.Series(['USA (1) Netherlands (5)' ,
'United Kingdom (2)','China (3) India (5) Pakistan (8)','USA (11) India (4)'], index=['a', 'b', 'c','d']), 
              'name' : pd.Series(['Bob', 'Joe', 'Alex', 'Bill'], index=['a', 'b', 'c','d'])}

>>> df
  name                  most_exhibitions
a Bob                  USA (1) India (5)
b Joe                 United Kingdom (2)
c Alex       China (3) India (5) USA (8)
d Bill                USA (11) India (4)

我试图弄清楚如何拆分每个单元格,然后可能从该国家/地区创建一个新列,并将相应的计数放在右行。如果国家/地区已经是一列,那么我只想将计数放在右行。

因此,最终数据帧将如下所示:

#    name                   most_exhibitions            USA    United Kingdom    China    India    
#a   Bob                  USA (1), India (5)              1                                   5
#b   Joe                  United Kingdom (2)                                2
#c   Alex      China (3), India (5), USA (8)              8                          3        5
#d   Bill                USA (11), India (4)             11                                   4

我想编写一个循环或函数来拆分数据,然后添加新列,但是我不知道该怎么做。我最终通过一系列字典来拆分和清理数据,现在仍然沉迷于如何将最终的字典制作成自己的数据框。我认为,如果我可以制作这个新的数据框,则可以将其附加到旧的数据框上。我还认为我正在使它变得比原来更难,并且对任何更优雅的解决方案都感兴趣。

到目前为止,这是我所做的:

>>>country_rank_df['country_split'] 
= indexed_rankdata['most_exhibitions'].str.split(",").astype(str)

from collections import defaultdict
total_dict = defaultdict(list)

dict2 = defaultdict(list)
dict3 = defaultdict(list)
dict4 = defaultdict(list)
dict5 = defaultdict(list)
dict6 = defaultdict(list)

for name, country_count in zip(head_df['name'], head_df['most_exhibitions']):

    total_dict[name].append(country_count)

for key, value in total_dict.iteritems():
    for line in value:
        new_line = line.split('(')
        dict2[key].append(new_line)

for key, list_outside in dict2.iteritems():
    for list_inside in list_outside:
        for value in list_inside:
            new_line = value.split(',')
            dict3[key].append(new_line)

for key, list_outside in dict3.iteritems():
    for list_inside in list_outside:
        for value in list_inside:
            new_line = value.split(')')
            dict4[key].append(new_line)

for key, list_outside in dict4.iteritems():
    for list_inside in list_outside:
        for value in list_inside:
            new_line = value.strip()
            new_line = value.lstrip()
            dict5[key].append(new_line)

for key, list_outside in dict5.iteritems():
    new_line = filter(None, list_outside)
    dict6[key].append(new_line)

>>>dict6['Bob']

[['USA',
  '1',
  'India',
  '5']]
耶斯列尔

您可以尝试这种方法,该方法主要使用字符串方法然后我pivotfillna数据框。我失去了原始专栏most_exhibitions,但我希望这是不必要的。

import pandas as pd

df = {'most_exhibitions' : pd.Series(['USA (1) Netherlands (5)' ,
'United Kingdom (2)','China (3) India (5) Pakistan (8)','USA (11) India (4)'], index=['a', 'b', 'c','d']), 
              'name' : pd.Series(['Bob', 'Joe', 'Alex', 'Bill'], index=['a', 'b', 'c','d'])}

df = pd.DataFrame(df)
#cange ordering of columns
df = df[['name', 'most_exhibitions']]
print df
#   name                  most_exhibitions
#a   Bob           USA (1) Netherlands (5)
#b   Joe                United Kingdom (2)
#c  Alex  China (3) India (5) Pakistan (8)
#d  Bill                USA (11) India (4)


#remove '(' and last ')'
df['most_exhibitions'] = df['most_exhibitions'].str.replace('(', '')
df['most_exhibitions'] = df['most_exhibitions'].str.strip(')')

#http://stackoverflow.com/a/34065937/2901002
s = df['most_exhibitions'].str.split(')').apply(pd.Series, 1).stack()
s.index = s.index.droplevel(-1)
s.name = 'most_exhibitions'
print s
#a               USA 1
#a       Netherlands 5
#b    United Kingdom 2
#c             China 3
#c             India 5
#c          Pakistan 8
#d              USA 11
#d             India 4
#Name: most_exhibitions, dtype: object

df = df.drop( ['most_exhibitions'], axis=1)
df = df.join(s)
print df
#   name  most_exhibitions
#a   Bob             USA 1
#a   Bob     Netherlands 5
#b   Joe  United Kingdom 2
#c  Alex           China 3
#c  Alex           India 5
#c  Alex        Pakistan 8
#d  Bill            USA 11
#d  Bill           India 4

#exctract numbers and convert them to integer
df['numbers'] = df['most_exhibitions'].str.extract("(\d+)").astype('int')
#exctract text of most_exhibitions
df['most_exhibitions'] = df['most_exhibitions'].str.rsplit(' ', n=1).str[0]
print df
#   name most_exhibitions  numbers
#a   Bob              USA        1
#a   Bob      Netherlands        5
#b   Joe   United Kingdom        2
#c  Alex            China        3
#c  Alex            India        5
#c  Alex         Pakistan        8
#d  Bill              USA       11
#d  Bill            India        4

#pivot dataframe
df = df.pivot(index='name', columns='most_exhibitions', values='numbers')
#NaN to empty string 
df = df.fillna('')
print df
#most_exhibitions  India  Netherlands  Pakistan China USA United Kingdom
#name                                                                   
#Alex                  5                      8     3                   
#Bill                  4                               11               
#Bob                                5                   1               
#Joe                                                                   2

编辑:

我尝试通过功能将所有列添加为推荐的输出merge

import pandas as pd

df = {'most_exhibitions' : pd.Series(['USA (1) Netherlands (5)' ,
'United Kingdom (2)','China (3) India (5) Pakistan (8)','USA (11) India (4)'], index=['a', 'b', 'c','d']), 
              'name' : pd.Series(['Bob', 'Joe', 'Alex', 'Bill'], index=['a', 'b', 'c','d'])}

df = pd.DataFrame(df)
#cange ordering of columns
df = df[['name', 'most_exhibitions']]
print df
#   name                  most_exhibitions
#a   Bob           USA (1) Netherlands (5)
#b   Joe                United Kingdom (2)
#c  Alex  China (3) India (5) Pakistan (8)
#d  Bill                USA (11) India (4)

#copy original to new dataframe for joining original df
df1 = df.reset_index().copy()

#remove '(' and last ')'
df['most_exhibitions'] = df['most_exhibitions'].str.replace('(', '')
df['most_exhibitions'] = df['most_exhibitions'].str.strip(')')

#http://stackoverflow.com/a/34065937/2901002
s = df['most_exhibitions'].str.split(')').apply(pd.Series, 1).stack()
s.index = s.index.droplevel(-1)
s.name = 'most_exhibitions'
print s
#a               USA 1
#a       Netherlands 5
#b    United Kingdom 2
#c             China 3
#c             India 5
#c          Pakistan 8
#d              USA 11
#d             India 4
#Name: most_exhibitions, dtype: object

df = df.drop( ['most_exhibitions'], axis=1)
df = df.join(s)
print df
#   name  most_exhibitions
#a   Bob             USA 1
#a   Bob     Netherlands 5
#b   Joe  United Kingdom 2
#c  Alex           China 3
#c  Alex           India 5
#c  Alex        Pakistan 8
#d  Bill            USA 11
#d  Bill           India 4

#exctract numbers and convert them to integer
df['numbers'] = df['most_exhibitions'].str.extract("(\d+)").astype('int')
#exctract text of most_exhibitions
df['most_exhibitions'] = df['most_exhibitions'].str.rsplit(' ', n=1).str[0]
print df
#   name most_exhibitions  numbers
#a   Bob              USA        1
#a   Bob      Netherlands        5
#b   Joe   United Kingdom        2
#c  Alex            China        3
#c  Alex            India        5
#c  Alex         Pakistan        8
#d  Bill              USA       11
#d  Bill            India        4

#pivot dataframe
df = df.pivot(index='name', columns='most_exhibitions', values='numbers')
#NaN to empty string 
df = df.fillna('')
df = df.reset_index()
print df
#most_exhibitions  name  India  Netherlands  Pakistan China USA United Kingdom
#0                 Alex      5                      8     3                   
#1                 Bill      4                               11               
#2                  Bob                   5                   1               
#3                  Joe                                                      2
print df1
#  index  name                  most_exhibitions
#0     a   Bob           USA (1) Netherlands (5)
#1     b   Joe                United Kingdom (2)
#2     c  Alex  China (3) India (5) Pakistan (8)
#3     d  Bill                USA (11) India (4)
df = pd.merge(df1,df, on=['name'])
df = df.set_index('index')
print df
#       name                  most_exhibitions  India  Netherlands  Pakistan  \
#index                                                                         
#a       Bob           USA (1) Netherlands (5)                   5             
#b       Joe                United Kingdom (2)                                 
#c      Alex  China (3) India (5) Pakistan (8)      5                      8   
#d      Bill                USA (11) India (4)      4                          
#
#      China USA United Kingdom  
#index                           
#a             1                 
#b                            2  
#c         3                     
#d            11                 

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何根据条件在数据框中创建新列

来自分类Dev

从不同数据框中设置新的Multiindex列的方法

来自分类Dev

从不同数据框中设置新的Multiindex列的方法

来自分类Dev

如何从不同的数据框中获取某些列的均值?

来自分类Dev

使用Fuzzywuzzy在数据框中创建新列

来自分类Dev

根据条件在数据框中创建新列

来自分类Dev

以迭代方式在数据框中创建多个新列

来自分类Dev

如何根据单独数据框中的两列结果在数据框中创建新列?

来自分类Dev

如何使用python中的循环在数据框中创建新列

来自分类Dev

R - 当两列或更多列在一行中匹配时在数据框中创建新列

来自分类Dev

如何在数据框中遍历列的子集以创建新变量

来自分类Dev

如何加快熊猫应用功能在数据框中创建新列?

来自分类Dev

如何在不同的输入参数中应用相同的函数在pandas数据框中创建新列?

来自分类Dev

如何在数据框中创建新列,其中新列的每一行都是所有先前行的乘法

来自分类Dev

在数据框行中查找值-创建新列以突出显示下一行匹配项

来自分类Dev

从不同的列开始替换数据框中的NA值

来自分类Dev

如何基于两个不同数据框中的匹配值创建新列?

来自分类Dev

如何基于R中的缺失数据在数据框中创建新行

来自分类Dev

如何基于另一个数据框上的条件匹配在数据框中创建新列?

来自分类Dev

语言:如何根据另一个数据框在数据框中创建新列?

来自分类Dev

根据现有列在数据框中创建新的累积列

来自分类Dev

在列之间进行减法运算以在数据框中创建新列

来自分类Dev

删除列的数字(零)并在数据框中创建一个新列

来自分类Dev

如何根据数据集中一列中数组中存在的多个值在数据集中创建新行

来自分类Dev

在数据框中创建新列:组中的索引(组之间不唯一)

来自分类Dev

根据先前列中的最新值在数据框中创建新列

来自分类Dev

如何在熊猫数据框中创建新列

来自分类Dev

如何在具有扩展条件的同时在数据框中创建具有多个条件的新列?

来自分类Dev

如何基于另一行的内容在数据框中创建新行

Related 相关文章

  1. 1

    如何根据条件在数据框中创建新列

  2. 2

    从不同数据框中设置新的Multiindex列的方法

  3. 3

    从不同数据框中设置新的Multiindex列的方法

  4. 4

    如何从不同的数据框中获取某些列的均值?

  5. 5

    使用Fuzzywuzzy在数据框中创建新列

  6. 6

    根据条件在数据框中创建新列

  7. 7

    以迭代方式在数据框中创建多个新列

  8. 8

    如何根据单独数据框中的两列结果在数据框中创建新列?

  9. 9

    如何使用python中的循环在数据框中创建新列

  10. 10

    R - 当两列或更多列在一行中匹配时在数据框中创建新列

  11. 11

    如何在数据框中遍历列的子集以创建新变量

  12. 12

    如何加快熊猫应用功能在数据框中创建新列?

  13. 13

    如何在不同的输入参数中应用相同的函数在pandas数据框中创建新列?

  14. 14

    如何在数据框中创建新列,其中新列的每一行都是所有先前行的乘法

  15. 15

    在数据框行中查找值-创建新列以突出显示下一行匹配项

  16. 16

    从不同的列开始替换数据框中的NA值

  17. 17

    如何基于两个不同数据框中的匹配值创建新列?

  18. 18

    如何基于R中的缺失数据在数据框中创建新行

  19. 19

    如何基于另一个数据框上的条件匹配在数据框中创建新列?

  20. 20

    语言:如何根据另一个数据框在数据框中创建新列?

  21. 21

    根据现有列在数据框中创建新的累积列

  22. 22

    在列之间进行减法运算以在数据框中创建新列

  23. 23

    删除列的数字(零)并在数据框中创建一个新列

  24. 24

    如何根据数据集中一列中数组中存在的多个值在数据集中创建新行

  25. 25

    在数据框中创建新列:组中的索引(组之间不唯一)

  26. 26

    根据先前列中的最新值在数据框中创建新列

  27. 27

    如何在熊猫数据框中创建新列

  28. 28

    如何在具有扩展条件的同时在数据框中创建具有多个条件的新列?

  29. 29

    如何基于另一行的内容在数据框中创建新行

热门标签

归档